регулярное выражение для письма с любого языка не работает в php

#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
  

Демонстрация на 3v4l.org

Ответ №2:

Это регулярное выражение может помочь вам просто сделать это:

 ^[pL_wds] $
  

введите описание изображения здесь

Вы можете упростить его еще больше, и оно все равно может работать, например:

 [pL_ds] 
  

которое вы могли бы удалить w для слов, а также для начальных ^ и конечных $ символов.

Основываясь на вашем регулярном выражении, я бы подумал, что это регулярное выражение может быть тем, которое может сработать:

 ([pLds_] )*([pLd] [pLds_] )*
  

введите описание изображения здесь

Оно создает две группы, используя () .