我正在尝试将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))
答案 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。你在那里度过的时间会多次为自己付出代价。快乐的复兴!