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

5
我正在尝试将preg_match检查从url检查更改为用户名检查,用户名长度应该在2-16个字符之间,并且可以包含破折号、空格和连字符。但是我遇到了以下错误:

警告:preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 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))
2个回答

8
问题在这里:
[\w- ]{2,16}*

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

如果你想匹配由2到16个[\w- ]字符组成的组,至少出现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上有一个很好的在线教程。你在那里花费的时间会多次回报。愉快的正则表达式编程!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接