Функция preg_quote работает некорректно? - PullRequest
2 голосов
/ 02 апреля 2019

Предположим, я хочу проверить ввод, чтобы разрешить буквы и цифры Unicode плюс настроенные символы.

$allow_symbols = './*!@%&[]:,-_ ';
// $allow_symbols = '';
$pattern = '/^['.preg_quote($allow_symbols).'\p{L}\p{N}]+$/iu';
print $pattern."\n";
preg_match($pattern, '');

Песочница находится здесь: http://sandbox.onlinephpfunctions.com/code/b99a8f042695d1dc1528834d21e6eb6ad62972e6

Я получил Warning</b>: preg_match(): Unknown modifier '\' in <b>[...][...]</b> on line <b>9</b>

Проблема возникает из $ allow_symbols, если я переопределю его пустой строкой, как она закомментирована - ничего плохого не произойдет.И когда я прошёл точно напечатанный шаблон до https://www.phpliveregex.com/p/rxj, он работает нормально.

Итак, в чем дело и как с этим бороться?

Ответы [ 2 ]

4 голосов
/ 02 апреля 2019

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

Установите его второй параметр ($delimiter), чтобы также экранировать косую черту:

$escaped_symbols = preg_quote($allow_symbols, '/');
$pattern = "/^[$escaped_symbols\p{L}\p{N}]+$/iu";
0 голосов
/ 23 мая 2019

Вы можете использовать библиотеку T-Regx , которая автоматически выбирает разделители и , обрабатывает небезопасные символы :

$allow_symbols = './*!@%&[]:,-_ ';

Pattern::prepare(['^[', [$allow_symbols], '\p{L}\p{N}]+$'], 'iu')->match('');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...