Правила проверки формы для regex_match

Я пытаюсь выяснить, что я делаю неправильно с этим правилом валидации, потому что он говорит об этой ошибке.

Правило проверки:

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

Ошибка:

Уровень важности: предупреждение
Сообщение: preg_match () [function.preg-match]: разделитель не должен быть буквенно-цифровым или обратным слэшем

Во-первых, вам нужно исправить свой шаблон. Ваш шаблон сейчас – a-z0-9

У него должен быть ограничитель, поэтому что-то вроде /a-z0-9/ (Если у вас есть проблемы с Codeigniter с использованием разделителей обратного слэша, у вас есть ряд других параметров: см . Страницу руководства на разделителях PCRE )

Теперь у вас есть шаблон, который буквально соответствует строке с a-z0-9 где a-z0-9 то в ней. Обратите внимание: если вы пытались сопоставить это как класс символов, вам нужно будет снова заключить его в скобки, чтобы сделать это так, чтобы /[a-z0-9]/

Теперь я собираюсь предположить, что вы действительно хотели проверить, что вся строка была (в нижнем регистре) буквенно-цифровым, а не только тем, что у нее был символ, соответствующий этому. В этом случае вам нужен передний якорь, ваш класс символов для соответствия, модификатор повторения (я предполагаю, что вы не хотите сопоставлять пустую строку и сделать ее одним или несколькими), а затем якорь, чтобы указать, что совпадение должен доходить до конца:

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

Вы даже можете установить минимальную длину, заменив фигурные скобки для плюса и обеспечив минимум, максимум (оставьте максимальную длину, чтобы она могла быть любой длины за минуту) … например, /^[a-z0-9]{3,}$

Таким образом, ваш третий параметр будет выглядеть следующим образом:

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

За исключением того, что это фактически не будет работать в Codeignign, очевидно (по состоянию на март 2011 года это было так или иначе), из-за того, как он обрабатывает скобки внутри правил проверки, поэтому вам нужно использовать обратный вызов ( см. Здесь ).

Использование обратного вызова :

Вы бы поставили в контроллере такую ​​функцию, как указано ниже:

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

Затем вы устанавливаете правило для вызова своей функции:

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

Примечания: функция называется с лидирующим знаком подчеркивания, чтобы предотвратить доступ к url, если вы создаете свою функцию обратного вызова в контроллере. Существует альтернативный способ сделать это, создав класс, который расширяет класс CI_Form_validation , но это похоже на более сложное решение. Если вы назовете функцию с лидирующим подчеркиванием, помните, что вы должны включить ее в свои правила, что приводит к _usernameRegex , _usernameRegex подчеркивания: один для префикса callback_ а второй для имени функции – _usernameRegex . Это может быть совершенно прямолинейно и не нужно указывать вам, но для меня это казалось чем-то, что можно было легко упустить. См. Связанный ответ для добавления пользовательского обратного вызова к проверке формы Codeigniter для подробного объяснения расширения CI_Form_validation . Обратите внимание: если вы продлеваете проверку формы, вам не нужно добавлять свою функцию с callback_ set_rules когда вы ссылаетесь на нее в set_rules .

Вы также можете установить сообщение для вашего нового обратного вызова:

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


Альтернативный маршрут – изменить собственный шаблон соответствия Codeigniter, используемый в правилах form_validation. Ссылка на форум Ellislab описывает проблему, а затем потенциальный способ обойти ее дальше по потоку . От взгляда на код Codeigniter и указанное исправление предлагаемое решение, которое они предоставили, может ломаться с использованием массивов в правилах: лучшее регулярное выражение, чтобы заменить его в функции Codeigniter с помощью рекурсивного соответствия, решило бы и то, и другое, но могло бы столкнуться с проблемами производительности на более тяжелых правила.

Соответствие шаблону Codeigniter для правил form_validation содержится в его файле system / libraries / Form_validation.php в строке 115 по 2.1.3.

php preg_match хочет, чтобы ваше регулярное выражение было окружено не-буквенно-цифровым символом (обычно каждый использует /), измените значение setRules () на это:

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