Я пытаюсь выяснить, что я делаю неправильно с этим правилом валидации, потому что он говорит об этой ошибке.
Правило проверки:
$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/]');