我试图将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快乐!