2014-07-15 22 views
8

Vi ringrazio in anticipo per il vostro tempo ad aiutare questo problema ..preg_match(): Compilazione non riuscita: gamma non valida in classe di caratteri all'offset 20

preg_match(): Compilazione non riuscita: gamma non valida in classe di caratteri all'offset 20 session.php on line 278

io non sono sicuro perché questo ha smesso di funzionare all'improvviso dopo mesi di lavoro potrebbe essere un aggiornamento nel codice ..

ecco il codice

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"); 
    } 
    } 

risposta

14

Un intervallo di classe di caratteri viene definito utilizzando - tra due valori in una classe di caratteri ([] in espressioni regolari). [0-9] significa tutto compreso tra 0 e 9 inclusi. Nell'espressione regolare del codice, esistono diversi intervalli di classi di caratteri, a-z, 0-9. C'è anche una classe che probabilmente non intendevi mettere lì, ovvero _-\s.

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

questo non è apprently considerato un intervallo di caratteri non valida in alcuni (la maggior parte?) Versioni di PCRE (regolare PHP libreria di espressione usa), ma potrebbe avere cambiato di recente, e se la libreria PCRE è stato aggiornato sul server, quella potrebbe essere la ragione.

Debuggex è un bel strumento che può aiutare gli errori di debug (o meglio, il messaggio di errore da PHP si sia la linea e il personaggio in cui l'errore è stato detto, così ..) come questo (che non sono affiliati, solo un fan).

+3

... o PHP stesso è stato aggiornato. Secondo RegexBuddy, PHP 5.5 richiede il trattino di escape o spostato alla fine dell'elenco se si desidera che corrisponda a un trattino letterale. Prima di ciò, a quanto pare, si supponeva che volevi dire questo perché '_- \ s' non ha senso come intervallo. –

+0

Sì, PHP raggruppa anche una versione di PCRE, in modo da finire con lo stesso problema. Buona pesca. – MatsLindh

+0

@AlanMoore: una possibilità troppo poco conosciuta è quella di mettere il trattino immediatamente dopo una classe di caratteri abbreviata: '\ s-_' –