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).
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
Możliwy duplikat: http://stackoverflow.com/questions/7660545/delimiter-must-not-be-alphanumeric-or-backslash-and-preg-match – RonaldBarzell
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
@Steven Farley, ponieważ pozwoliłoby to na wielkie litery, których nie chcę. –