2012-12-21 18 views
6

Próbuję dowiedzieć się, co robię źle z tą zasadą sprawdzania poprawności, ponieważ mówi to błąd.Reguły sprawdzania poprawności formularzy dla regex_match

reguły poprawności:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]'); 

Błąd:

Severity: Warning
Message: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+1

Możliwy duplikat: http://stackoverflow.com/questions/7660545/delimiter-must-not-be-alphanumeric-or-backslash-and-preg-match – RonaldBarzell

+1

Dlaczego nie użyć zamiast tego reguły 'alpha_numeric'? Zobacz [Form Validation Rules] (http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference) – PhearOfRayne

+0

@Steven Farley, ponieważ pozwoliłoby to na wielkie litery, których nie chcę. –

Odpowiedz

12

Po pierwsze, trzeba naprawić swój wzór. Twój wzór teraz jest a-z0-9

To musi mieć ogranicznik otaczającą go, więc coś podobnego /a-z0-9/ (jeśli masz problemy w CodeIgniter użyciu znaku odwrotnego ukośnika ograniczniki, masz kilka innych opcji: patrz The manual page on PCRE delimiters)

teraz masz wzorzec, który dosłownie pasuje do ciągu znaków z a-z0-9 gdzieś w nim. Zauważ, że jeśli próbujesz dopasować to jako klasę postaci, musisz ponownie zamknąć ją w nawiasach, aby to zrobić, więc teraz, tak zakładam, że faktycznie chciałeś sprawdzić, czy cały ciąg znaków (małe litery) był alfanumeryczny, nie tylko dlatego, że zawierał znak pasujący do tego. W takim przypadku potrzebujesz przedniej kotwicy, twojej klasy postaci do dopasowania, modyfikatora powtórzeń (zakładam, że nie chcesz dopasować pustego ciągu i uczynić go jednym lub więcej), a następnie kotwicy, aby określić, że dopasowanie należy przedłużyć do końca:

/^[a-z0-9]+$/

można nawet ustawić minimalną długość zastępując szelki na plus i zapewnienie minimum, maksimum (opuścić max out aby mogła ona być dowolnej długości ponad min). .. na przykład /^[a-z0-9]{3,}$

Więc trzeci parametr byłoby końcu wygląda tak:

'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'

wyjątkiem że to faktycznie nie będzie działać w CodeIgniter widocznie (od marca 2011 był to przypadek tak), ze względu na to, jak uchwyty uchwyty wewnątrz zasady walidacji, więc trzeba użyj wywołania zwrotnego (see here).

Korzystanie z callback:

by umieścić funkcję jak następuje w kontrolerze (lub inaczej odpowiednim zakresie):

public function _usernameRegex($userName) { 
    if (preg_match('/^[a-z0-9]+$/', $userName)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

Następnie ustawić regułę, aby połączyć się z funkcji:

set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex'); 

Uwagi: funkcja nosi nazwę z wiodącym podkreślnikiem, aby uniemożliwić dostęp do adresu URL, jeśli utworzysz funkcję zwrotną w kontrolerze. Istnieje alternatywny sposób, aby to zrobić, tworząc klasę, która rozszerza klasę CI_Form_validation, ale wydawało się to bardziej skomplikowanym rozwiązaniem. Jeśli nazwiesz funkcję z wiodącym znakiem podkreślenia, pamiętaj, że musisz musi następnie uwzględnić to w swoich regułach, co powoduje, że callback__usernameRegex ma dwa całkowite podkreślenia: jeden dla prefiksu callback_, a drugi dla nazwy funkcji, _usernameRegex.To może być zupełnie proste i nie trzeba ci wskazywać, ale dla mnie wydawało się, że można je łatwo przeoczyć. Aby uzyskać szczegółowe wyjaśnienie rozszerzenia CI_Form_validation, zobacz odpowiedź związaną z numerem Adding custom callback to Codeigniter Form Validation. Zauważ, że jeśli przedłużysz sprawdzanie formularza, nie musisz dodawać swojej funkcji za pomocą callback_, gdy odwołasz się do niego w set_rules.

Można również ustawić komunikat dla nowego zwrotnego:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


Trasa alternatywna jest modyfikować własne mecz wzór CodeIgniter wykorzystywanych na zasadach form_validation. Łącze do forum Ellislaba opisuje problem, a następnie potencjalny sposób obejścia go: further down the thread. Spoglądając na kod Codeigniter i określoną poprawkę, proponowane przez niego rozwiązanie może zostać złamane za pomocą tablic w regułach: lepsze wyrażenie regularne, które zastąpi funkcję w funkcji Codeigniter przy użyciu rekurencyjnego dopasowywania, rozwiąże oba, ale może spowodować problemy z wydajnością na cięższym zasady.

Dopasowanie wzorca kodu dla reguł form_validation znajduje się w pliku system/libraries/Form_validation.php, w linii 115 od wersji 2.1.3. preg_match

+1

Musisz umieścić/wewnątrz [], ponieważ codeigniter oczekuje, że wyrażenie regularne będzie otoczone przez []. –

+0

To był dobry haczyk i mój błąd w odniesieniu do działania codeigniter =) Powinien być teraz naprawiony – taswyn

+0

Dobry połów na rzeczywistym wyrażeniu regularnym nie będącym w klasie znaków –

0

PHP chce wyrażenie regularne otoczone nieprzestrzegania znaku alfanumerycznego (zazwyczaj każdy używa /), zmienić setRules(), aby w ten sposób:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]'); 
Powiązane problemy