Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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 正则表达式匹配任何UTF字符(标点符号除外)_Php_Regex_Utf 8 - Fatal编程技术网

Php 正则表达式匹配任何UTF字符(标点符号除外)

Php 正则表达式匹配任何UTF字符(标点符号除外),php,regex,utf-8,Php,Regex,Utf 8,我正在用PHP编写一个函数,自动转换一个字符串作为URL(*.html)中的文件名。尽管出于安全考虑,ASCII应该被使用,但出于SEO需要,我需要允许文件名使用任何语言,但我不希望它包含除破折号(-)和下划线(35;)以外的标点符号,不允许使用像*%$#@这样的字符 空格应转换为破折号 我认为使用正则表达式将是最简单的方法,但我不确定如何处理UTF8字符串 我的ASCII函数如下所示: function convertToPath($string) { $string = strtol

我正在用PHP编写一个函数,自动转换一个字符串作为URL(*.html)中的文件名。尽管出于安全考虑,ASCII应该被使用,但出于SEO需要,我需要允许文件名使用任何语言,但我不希望它包含除破折号(-)和下划线(35;)以外的标点符号,不允许使用像*%$#@这样的字符

空格应转换为破折号

我认为使用正则表达式将是最简单的方法,但我不确定如何处理UTF8字符串

我的ASCII函数如下所示:

function convertToPath($string)
{
    $string = strtolower(trim($string));
    $string = preg_replace('/[^a-z0-9-]/', '-', $string);
    $string = preg_replace('/-+/', "-", $string);
    return $string;
}
谢谢


Roy.

如果选择了UTF-8模式,您可以使用

因此,我会尝试以下方法(未经测试):


请注意,UTF-8字符串上会出现问题,因为它会干扰多字节字符-请改用。

我认为,对于SEO需求,您应该坚持URL中的ASCII字符

理论上,URL中允许有更多的字符。实际上,大多数系统只解析ASCII码

此外,许多自动解析链接脚本的方法都会阻塞非ASCII字符。因此,允许URL中包含非ASCII字符的URL大大减少了在用户生成的内容中显示(正确)链接的更改。 (如果您想要此类脚本的示例,请查看stackoverflow脚本,例如,它会被括号阻塞)

您还可以看看:

公认的解决方案是转换非ASCII字符:

<?php
  $text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
?>


希望这对您有所帮助

您在这一点上是正确的-在URL中保留非ASCII字符将导致问题,因为您必须跟踪客户端浏览器的URL编码(不太一致)。但请注意,iconv音译需要设置正确的区域设置(UTF-8编码)-使用Windows这也会将重音(通常为非间隔)替换为“-”,因此“aït Ben Haddou”将变成“Ai-t Ben Haddou”。
function convertToPath($string)
{
    $string = mb_strtolower(trim($string), 'UTF-8');
    $string = preg_replace('/\P{L}+/', '-', $string);
    $string = preg_replace('/-+/', "-", $string);
    return $string;
}
<?php
  $text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
?>