2011-04-16 44 views
4

我想改变preg_match检查从URL检查到用户名检查是最小/最大2-16chrs,破折号,空间& hypen可以接受。我得到这个错误警告:preg_match()[function.preg-match]:编译失败:没有重复的偏移量

警告:的preg_match()[function.preg匹配]:编译失败:没有重复的偏移量为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)) 

回答

8

的问题是在这里:

[\w- ]{2,16}* 

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

如果你正在寻找匹配的2至16 [\w- ] s,至少0次组,在子模式把它包装和附加*外:

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

BoltClock说什么是正确的。但是,你的正则表达式也有其他问题。首先,为您解决眼前的问题,这里有一个正则表达式,验证用户名是从2到16个字符只包含字母,数字,下划线,破折号/连字符和空格:

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

注意'empty() ||'子句不需要,因为正则表达式只有在至少有2个字符的情况下才匹配。其次,正则表达式非常有用(甚至可以是有趣!),但是如果你打算使用它们,你需要坐下来学习语法,简单明了(它并不那么难)。我强烈建议花一两个小时来学习基础知识。有一个很好的在线教程:www.regular-expressions.info。你花在那里的时间会多次为自己付出。快乐的regexing!

相关问题