【问题标题】:Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset警告:preg_match() [function.preg-match]:编译失败:在偏移量处没有可重复的内容
【发布时间】:2011-04-16 07:58:41
【问题描述】:

我正在尝试将 preg_match 检查从 url 检查更改为最小/最大 2-16chrs、破折号、空格和连字符可接受的用户名检查。我收到了这个错误

警告: preg_match() [function.preg-match]:编译失败:在偏移量 14 处没有可重复的内容

if(empty($string) || preg_match("#^([\w- ]{2,16}*(?:.[\w- ]{2,16}*)+):?(d+)?/?#i", $string))

查找 URL 的旧代码

if(empty($string) || preg_match("#^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?#i", $string))

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    问题出在这里:

    [\w- ]{2,16}*
    

    {2,16}* 不能同时使用,只能使用其中一个。

    如果您希望匹配 2 到 16 个 [\w- ]s 的组,至少 0 次,请将其包装在子模式中并在外部附加 *

    (?:[\w- ]{2,16})*
    

    【讨论】:

      【解决方案2】:

      BoltClock 说的是正确的。但是您的正则表达式也存在其他问题。首先,为了解决您眼前的问题,这里有一个正则表达式,它验证用户名的长度为 2 到 16 个字符,仅包含字母、数字、下划线、破折号/连字符和空格:

      if (preg_match('/^[A-Za-z0-9_\- ]{2,16}$/', $string)) {
          // Valid username.
      }
      

      请注意,不需要'empty() ||' 子句,因为正则表达式仅在至少有 2 个字符时才匹配。

      其次,正则表达式非常有用(甚至可以很有趣!),但是如果你要使用它们,你需要坐下来学习语法,简单明了(它不是很难)。我强烈建议花一两个小时学习基础知识。有一个很好的在线教程:www.regular-expressions.info。你在那里度过的时间会多倍地收回成本。快乐的正则表达式!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多