函数preg_quote工作不正确吗?

时间:2019-04-02 18:16:53

标签: php regex

假设我要检查输入以允许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 个答案:

答案 0 :(得分:4)

preg_quote默认情况下不会转义正则表达式的delimiter,因为它可以是任何非字母数字,非反斜杠,非空格字符。

设置其第二个参数($delimiter)也可以转义正斜杠:

$escaped_symbols = preg_quote($allow_symbols, '/');
$pattern = "/^[$escaped_symbols\p{L}\p{N}]+$/iu";

答案 1 :(得分:0)

您可以使用T-Regx libraryautomatically choses delimiters中的handles unsafe characters

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

Pattern::prepare(['^[', [$allow_symbols], '\p{L}\p{N}]+$'], 'iu')->match('');