【问题标题】:preg_replace to convert a user input string to a link patternpreg_replace 将用户输入字符串转换为链接模式
【发布时间】:2012-09-29 07:11:45
【问题描述】:

我想转换用户输入的字符串

"something ... un//important ,,, like-this"

“像这样不重要的东西”

所以基本上用“-”删除所有重复出现的特殊字符。我已经用谷歌搜索并来到了这个

preg_replace('/[-]+/', '-', preg_replace('/[^a-zA-Z0-9_-]/s', '-', strtolower($string)));

我很想知道这是否可以用一个 preg_replace() 来完成。

只是为了清除问题: 用连字符 (-) 替换所有特殊字符和空格。如果连续出现更多事件,则用单个连字符替换它们

我的解决方案可以按我的意愿完美运行,但我希望在一次通话中也能做到这一点

【问题讨论】:

    标签: php preg-replace


    【解决方案1】:

    昨天有一个类似的问题,但我手头没有。

    在你当前的 first 模式中:

    [^a-zA-Z0-9_-]
    

    您只寻找一个字符。如果你对一个或多个进行贪婪匹配,正则表达式引擎会自动将其中的多个替换为一个:

    [^a-zA-Z0-9_-]+
                  ^- + = one or more
    

    那么你仍然会遇到字符串中存在的-没有被捕获的问题,所以你需要将它们从“not-in”字符类中取出:

    [^a-zA-Z0-9_]+
    

    然后应该这样做:

    preg_replace('/[^a-zA-Z0-9_]+/s', '-', strtolower($string));
    

    由于它只是小写字母,因此您也不需要查找A-Z,只需另一种缩减即可:

    preg_replace('/[^a-z0-9_]+/s', '-', strtolower($string));
    

    参见重复和/或量词+ 是其中之一(参见Repetition­DocsRepetition with Star and Plus­regular-expressions.info)。

    此外,如果您查看modifiers­Docs,您会发现 s (PCRE_DOTALL) 修饰符不是必需的:

    $urlSlug = preg_replace('/[^a-z0-9_]+/', '-', strtolower($string));
    

    希望这对您有所帮助,并向您解释一下您正在使用的正则表达式,以及您可以在哪里找到更多有用的文档。

    【讨论】:

    • 感谢您的详细解答。正则表达式有时会超出我的想象。
    • 它是一个强大的工具,现在在preg module (PCRE) 的php 手册中也有文档。 regular-expressions.info 是对正则表达式的一个很好的解读,它很好地划分并且在我看来是一个非常好的资源。
    • 感谢您提供的链接,以后肯定会通过这些链接。
    【解决方案2】:

    试试这个:

    preg_replace('/[^a-zA-Z0-9_-]+/s', '-', strtolower($string));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多