#php #regex
#php #регулярное выражение
Вопрос:
Я использую следующее регулярное выражение, чтобы разрешить буквы с любого языка, цифры, подчеркивание и пробелы.
^[p{L}0-9 _]*[p{L}0-9][p{L}0-9 _]*$
Оно отлично работает в онлайн-инструментах тестирования регулярных выражений, но не в моем PHP-коде. Например, оно не будет соответствовать, скажем, любому русскому слову «Привет».
Есть идеи, почему?
Версия PHP: PHP 7.1.16
Ответ №1:
У вас есть пара проблем с вашим регулярным выражением. Во-первых, оно будет соответствовать только 3 символам без добавления *
или
после одного из наборов символов. Во-вторых, чтобы соответствовать юникоду в PHP, вам нужно использовать u
модификатор в вашем регулярном выражении. Попробуйте это вместо:
$str = 'Привет';
$regex = '/^[p{L}0-9 _][p{L}0-9] [p{L}0-9 _]$/u';
echo preg_match($regex, $str);
Вывод:
1
Ответ №2:
Это регулярное выражение может помочь вам просто сделать это:
^[pL_wds] $
Вы можете упростить его еще больше, и оно все равно может работать, например:
[pL_ds]
которое вы могли бы удалить w для слов, а также для начальных ^ и конечных $ символов.
Основываясь на вашем регулярном выражении, я бы подумал, что это регулярное выражение может быть тем, которое может сработать:
([pLds_] )*([pLd] [pLds_] )*
Оно создает две группы, используя ()
.