PHP pregèu替换不';使用文件名字符串时不能按预期操作
我正在尝试创建一个函数,该函数从字符串中删除所有非英语字符(空格、点和连字符除外)。为此,我尝试使用preg_replace,但该函数会产生奇怪的结果 我有一个名为“example-נידל.jpg”的文件 以下是我在尝试清理文件名时得到的结果:PHP pregèu替换不';使用文件名字符串时不能按预期操作,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试创建一个函数,该函数从字符串中删除所有非英语字符(空格、点和连字符除外)。为此,我尝试使用preg_replace,但该函数会产生奇怪的结果 我有一个名为“example-נידל.jpg”的文件 以下是我在尝试清理文件名时得到的结果: echo preg_replace('/[^A-Za-z0-9\.]/','','example-נידדל.jpg'); 上面生成:example.jpg,与预期一致 但是,当我将文件上传到服务器后尝试从$\u FILES数组中提取文件名时,我得到
echo preg_replace('/[^A-Za-z0-9\.]/','','example-נידדל.jpg');
上面生成:example.jpg,与预期一致
但是,当我将文件上传到服务器后尝试从$\u FILES数组中提取文件名时,我得到:
echo preg_replace('/[^A-Za-z0-9\.]/','',$_FILES['file_upload']["name"]);
上面生成的示例-15041497149114911500.jpg
我得到的数字实际上是假定要删除的字符的HTML数字,请参见以下字符参考:
我不明白为什么preg_不能用文件名替换work
有人能帮忙吗
谢谢
Roy我将使用正则表达式和iconv的组合来音译它 更新:之前的音译/过滤需要对文件名mabye进行URL解码:
$path = urldecode($path); // convert triplets to bytes.
下面是一个与您的问题非常相似的代码示例:
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;
}
它希望您的into是UTF-8编码的
在preg\u replace
之前,如何使用将HTML实体转换回UTF-8
echo preg_replace('/[^A-Za-z0-9\.]/', '', mb_convert_encoding($_FILES['file_upload']["name"], 'UTF-8', 'HTML-ENTITIES'));
页面和表单上的字符集是什么?只需
echo$\u FILES['file\u upload'][“name”]
并查看结果。我已将图像重命名为上面的名称并尝试上载它。不管我是否为表单指定accept字符集
,或者添加charset
meta标记,我总是让它返回example.jpg。在你上传之前,你确定你上传的文件实际上不是名为example-15041497149114911500.jpg吗?我现在检查了一下,我得到的数字与应该被替换的受人尊敬的HTML字符相关:@Roy Peleg-请看看我的答案是否解决了你的问题。尝试了一下,结果仍然相同:-(@Roy Peleg:我闻到文件名是URL编码的。所以需要先对其进行URL解码。我会再添加一段代码,也许会有帮助。