php basename不支持中文怎么办

—— basename()函数获取文件名的问题
标签: 函数 乱码
2017-12-12 阅读(454)

不久前遇到一段代码使用了basename,我文件名是中文的,每次返回都只有后缀。后来发现basename函数有猫腻,不支持中文文件名,但凡有以中文开头的文件名将被忽略了。


函数说明

/**
 * 从路径中返回文件名
 * @param string $path 
 * 在Windows中无论是斜线(/)和反斜杠(\)作为目录分隔符。在其他环境中,它是前斜杠(/)
 * @param string $suffix [optional] 可选。规定文件扩展名。过滤后缀结尾
 * @return string 文件名
 * @since 4.0
 * @since 5.0
 */
function basename($path, $suffix = null){}


演示例子

$path = "我是中文名.jpg";
$res = basename($path);
var_dump($res);
//string '.jpg' (length=4)

有大神前辈说了问题出在底层mblen,它发现全是中文的时候会返回负数。不以中文开头,可以骗过mblen。

不以中文件名开头试下:

$path = "a我是中文名.jpg";
$res = basename($path);
var_dump($res);
//string 'a我是中文名.jpg' (length=20)

厉害了,我的哥。


然而我的系统并不能保证全部文件名都是英文开头的。那怎么办呢,查了很多资料,用了很多办法都没有用。最后还是,寻找代替方案。找到了以下几个方案:

方案1

$path = "/路径/我是中文名.jpg";
$res = substr($path, strrpos($path, '/')+1);
var_dump($res);

方案2

$path = "/路径/我是中文名.jpg";
$res = preg_replace('/^(.+[\\/])|(\\/)/', '', $path);
var_dump($res);

方案3

$path = "/路径/我是中文名.jpg";
$res = explode('/',$path);
$res = end($res);
var_dump($res);

方案4

$path = "/路径/我是中文名.jpg";
$res = explode("/",$path);
$res = array_pop($res);
var_dump($res);

方案5

$path = "/路径/我是中文名.jpg";
$res = ltrim(substr($path, strrpos($path, '/')),'/');
var_dump($res);


路过的朋友,如有更好的办法,请不吝赐教!


原创文章,转载请注明出处:https://www.weizhixi.com/user/index/article/id/30.html

分类:
点击(530) 阅读(454) 举报