代码之家  ›  专栏  ›  技术社区  ›  Roy Peleg

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

  •  3
  • Roy Peleg  · 技术社区  · 17 年前

    我正在用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;
    }
    

    罗伊。

    2 回复  |  直到 17 年前
        1
  •  4
  •   Stefan Gehrig    17 年前

    如果选择UTF-8模式,则可以选择所有非- 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;
    }
    

    strtolower() 在UTF-8字符串上,因为它会干扰多字节字符-使用 mb_strtolower() 相反

        2
  •  4
  •   Community Mohan Dere    9 年前

    我认为对于搜索引擎优化的需要,你应该坚持在URL中使用ASCII字符。

    (如果您想要此类脚本的示例,请查看stackoverflow脚本,例如,它会被括号阻塞)

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

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

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