正则表达式匹配除标点符号之外的任何UTF字符

时间:2009-04-12 09:21:55

标签: php regex utf-8

我正在准备PHP中的一个函数来自动转换字符串以用作URL(* .html)中的文件名。尽管ASCII应该用于安全方面,但对于搜索引擎优化需要我需要允许文件名使用任何语言,但我不希望它包括除短划线( - )和下划线(_)之外的标点符号,字符喜欢*%$#@“'不应该被允许。

空格应转换为破折号。

我认为使用Regex将是最简单的方法,但我不确定如何处理UTF8字符串。

我的ASCII函数如下所示:

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

谢谢,

罗伊。

2 个答案:

答案 0 :(得分:4)

如果选择了UTF-8模式,您可以使用 Letter (根据Unicode常规类别 - 请参阅PHP文档Regular Expression Details) >

/\P{L}+/

所以我尝试以下(未经测试):

function convertToPath($string)
{
    $string = mb_strtolower(trim($string), 'UTF-8');
    $string = preg_replace('/\P{L}+/', '-', $string);
    $string = preg_replace('/-+/', "-", $string);
    return $string;
}

请注意,您会在UTF-8字符串上获得strtolower()的问题,因为它会让您遇到多字节字符 - 请改用mb_strtolower()

答案 1 :(得分:4)

我认为对于搜索引擎优化需求,您应该坚持使用网址中的ASCII字符。

理论上,URL中允许使用更多字符。实际上,大多数系统只解析ASCII可靠。

此外,许多自动解析链接脚本会阻塞非ASCII字符。因此,允许在您的网址中使用非ASCII字符的网址会大大减少在用户生成的内容中显示(正确)的链接更改。 (如果你想要这样一个脚本的例子,看一下stackoverflow脚本,例如它在括号上窒息)

您还可以查看: How to handle diacritics (accents) when rewriting ‘pretty URLs’

接受的解决方案是转换非ASCII字符:

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

希望这有帮助