PHP preg_replace无法按预期使用文件名字符串

时间:2011-06-18 17:58:05

标签: php regex preg-replace

我正在尝试创建一个从字符串中删除所有无英文字符(空格,点和连字符除外)的函数。为此,我尝试使用preg_replace,但该函数产生奇怪的结果。

我有一个名为“example-נידדל.jpg”的文件

以下是我在尝试清理文件名时所得到的内容:

echo preg_replace('/[^A-Za-z0-9\.]/','','example-נידדל.jpg');

以上产生: example.jpg 如预期。

但是当我尝试从$ _FILES数组中将文件名上传到服务器后,我得到了:

echo preg_replace('/[^A-Za-z0-9\.]/','',$_FILES['file_upload']["name"]);

以上产生 example-15041497149114911500.jpg

我得到的数字实际上是假设要删除的字符的HTML编号,请参阅以下字符参考:http://realdev1.realise.com/rossa/phoneme/listCharactors.asp?start=1488&stop=1785&rows=297&page=1

我无法弄清楚为什么preg_replace不能使用文件名。

有人可以帮忙吗?

谢谢,

罗伊

2 个答案:

答案 0 :(得分:2)

preg_replace之前使用mb_convert_encoding将HTML实体转换回UTF-8怎么样?

echo preg_replace('/[^A-Za-z0-9\.]/', '', mb_convert_encoding($_FILES['file_upload']["name"], 'UTF-8', 'HTML-ENTITIES'));

答案 1 :(得分:1)

我会使用正则表达式和iconv的组合来音译它。

更新:事先音译/过滤文件名mabye需要被解码:

$path = urldecode($path); // convert triplets to bytes.

以下是来自here的代码示例,它与您的问题非常相似:

function pathauto_cleanstring($string)
{
    $url = $string;
    $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url); // substitutes anything but letters, numbers and '_' with separator
    $url = trim($url, "-");
    $url = iconv("utf-8", "us-ascii//TRANSLIT", $url); // TRANSLIT does the whole job
    $url = strtolower($url);
    $url = preg_replace('~[^-a-z0-9_]+~', '', $url); // keep only letters, numbers, '_' and separator
    return $url;
}

它希望你的编码是UTF-8编码。

Reference