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