警告:preg_match()[function.preg-match]:编译失败:无法在偏移处重复

时间:2011-04-16 07:58:42

标签: php regex preg-match

我正在尝试将urg检查中的preg_match检查更改为用户名检查,这是最小/最大2-16chrs,破折号,空格和&炒作可以接受。我收到此错误

  

警告: preg_match()[function.preg-match]:编译失败:无法在偏移量14处重复

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

寻找网址的旧代码

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

2 个答案:

答案 0 :(得分:8)

问题在于:

[\w- ]{2,16}*

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

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

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

答案 1 :(得分:1)

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

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

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

其次,正则表达式非常有用(甚至可以有趣!),但是如果你打算使用它们,你需要坐下来学习语法,简单明了(不是那很难)。我强烈建议花一两个小时研究基础知识。有一个很棒的在线教程:www.regular-expressions.info。你在那里度过的时间会多次为自己付出代价。快乐的复兴!