Регулярное выражение: латиница, кирилица, пробел, дефис

Регулярное выражением должно пропускать только латиницу, кирилицу пробелы и дефисы.

То есть, должен пропускать: Данте, Dante, Dante lol, Данте-LOL.

Но почему-то моя регулярка, описанная ниже, не работает как надо:

Тестирую так:

if (preg_match('/^[а-яА-Яa-zA-ZЁёәіңғүұқөһӘІҢҒҮҰҚӨҺ\-\s]*$/','Данте')) {
echo 1;
} else {
echo 2;
}

И по факту, в примере только валидная кирилица но почему то выдает всё равно "2" как невалидный результат.

Подскажите, пожалуйста. где я ошибся?


Ответы (1 шт):

Автор решения: ipatev_nn
if (preg_match('/^[а-яА-Яa-zA-ZЁёәіңғүұқөһӘІҢҒҮҰҚӨҺ\-\s]*$/','Данте')) {
...

Само по себе регулярное выражение составлено верно, но не указаны необходимые флаги:
u - поддержка unicode, для работы с кириллицей
m - поддержка multiline, для возможности установить начало^ и конец$ строки.
i - игнорирование регистра символов
Дополнительно:
Я бы изменил \s только на горизонтальные пробельные символы \h и что бы не экранировать дефис- установил бы его в начале или конце шаблона, а так же установил бы квантификатор запрещающий 0 символов, к примеру + или {1,} означающие один и более символов, иначе true вернет пустая строка.

if (preg_match('/^[А-ЯA-ZёәіңғүұқөһӘІҢҒҮҰҚӨҺ\h-]+$/umi','Данте')) {
...

Даже с учетом изменения квантификатора, есть риск того, что успешно пройдет валидацию строка состоящая из пробелов и табуляций.

→ Ссылка