2014-07-15 170 views
8

预先感谢您为您的时间在这个问题上帮助..的preg_match():编译失败:无效的范围在字符类偏移量20

的preg_match():编译失败:无效的范围在字符类在偏移线278

我不知道为什么,这停止工作突然工作的几个月后,会不会是在代码升级20 session.php文件..

这里是代码

else{ 
    /* Spruce up username, check length */ 
    $subuser = stripslashes($subuser); 
    if(strlen($subuser) < $config['min_user_chars']){ 
     $form->setError($field, "* Username below ".$config['min_user_chars']."characters"); 
    } 
    else if(strlen($subuser) > $config['max_user_chars']){ 
     $form->setError($field, "* Username above ".$config['max_user_chars']."characters"); 
    } 


    /* Check if username is not alphanumeric */ 
    /* PREG_MATCH CODE */ 

    else if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){   
     $form->setError($field, "* Username not alphanumeric"); 
    } 


    /* PREG_MATCH CODE */ 


    /* Check if username is reserved */ 
    else if(strcasecmp($subuser, GUEST_NAME) == 0){ 
     $form->setError($field, "* Username reserved word"); 
    } 
    /* Check if username is already in use */ 
    else if($database->usernameTaken($subuser)){ 
     $form->setError($field, "* Username already in use"); 
    } 
    /* Check if username is banned */ 
    else if($database->usernameBanned($subuser)){ 
     $form->setError($field, "* Username banned"); 
    } 
    } 

回答

14

字符类的范围通过在字符类中使用两个值(在正则表达式中为[])来定义。 [0-9]表示0到9之间的所有值,包括0和9。在代码中的正则表达式中,您有几个字符类范围,a-z,0-9。还有一类你可能并不想要放在那里,即_-\s

"/^[a-z0-9]([0-9a-z_-\s])+$/i" 
        ^^^^ 

这apprently没有考虑PCRE(正则表达式库PHP使用)的某些(大多数?)版本无效字符范围,但可能最近改变,如果PCRE库升级上服务器,这可能是原因。

Debuggex是一个很好的工具,可以帮助调试错误(当然,从PHP错误消息告诉你俩行其中错误是字符,所以..)这样的(我不是下属,只是一个风扇)。

+3

...或PHP本身已升级。根据RegexBuddy的说法,PHP 5.5要求连字符被转义或移动到列表的末尾,如果你想要它匹配一个文字连字符。在此之前,显然,它只是假定你的意思是因为'_- \ s'作为一个范围没有意义。 –

+0

是的,PHP捆绑了PCRE的一个版本,所以最终会出现同样的问题。接得好。 – MatsLindh

+0

@AlanMoore:太少知道的可能性是在简写字符类后立即加上连字符:'\ s-_' –

相关问题