2014-07-15 193 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-_' –

相關問題