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


Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset

我试图将preg_match检查从url检查更改为用户名检查,这是最小/最大2-16chrs,破破号,空间&hypen接受。我得到这个错误

Warning: preg_match() [function. s][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))

问题就在这里:

['w- ]{2,16}*

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

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

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

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

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

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

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