我正在尝试创建一个从字符串中删除所有无英文字符(空格,点和连字符除外)的函数。为此,我尝试使用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不能使用文件名。
有人可以帮忙吗?
谢谢,
罗伊
答案 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编码。