Регулярное выражение: латиница, кирилица, пробел, дефис
Регулярное выражением должно пропускать только латиницу, кирилицу пробелы и дефисы.
То есть, должен пропускать: Данте, Dante, Dante lol, Данте-LOL.
Но почему-то моя регулярка, описанная ниже, не работает как надо:
Тестирую так:
if (preg_match('/^[а-яА-Яa-zA-ZЁёәіңғүұқөһӘІҢҒҮҰҚӨҺ\-\s]*$/','Данте')) {
echo 1;
} else {
echo 2;
}
И по факту, в примере только валидная кирилица но почему то выдает всё равно "2" как невалидный результат.
Подскажите, пожалуйста. где я ошибся?
Ответы (1 шт):
if (preg_match('/^[а-яА-Яa-zA-ZЁёәіңғүұқөһӘІҢҒҮҰҚӨҺ\-\s]*$/','Данте')) {
...
Само по себе регулярное выражение составлено верно, но не указаны необходимые флаги:
u - поддержка unicode, для работы с кириллицей
m - поддержка multiline, для возможности установить начало^ и конец$ строки.
i - игнорирование регистра символов
Дополнительно:
Я бы изменил \s только на горизонтальные пробельные символы \h и что бы не экранировать дефис- установил бы его в начале или конце шаблона, а так же установил бы квантификатор запрещающий 0 символов, к примеру + или {1,} означающие один и более символов, иначе true вернет пустая строка.
if (preg_match('/^[А-ЯA-ZёәіңғүұқөһӘІҢҒҮҰҚӨҺ\h-]+$/umi','Данте')) {
...
Даже с учетом изменения квантификатора, есть риск того, что успешно пройдет валидацию строка состоящая из пробелов и табуляций.