Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP pregèu替换不';使用文件名字符串时不能按预期操作_Php_Regex_Preg Replace - Fatal编程技术网

PHP pregèu替换不';使用文件名字符串时不能按预期操作

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数组中提取文件名时,我得到

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

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

以下是我在尝试清理文件名时得到的结果:

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解码。我会再添加一段代码,也许会有帮助。