假设我要检查输入以允许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时,效果很好。
那怎么了,怎么处理?
答案 0 :(得分:4)
preg_quote
默认情况下不会转义正则表达式的delimiter,因为它可以是任何非字母数字,非反斜杠,非空格字符。
设置其第二个参数($delimiter
)也可以转义正斜杠:
$escaped_symbols = preg_quote($allow_symbols, '/');
$pattern = "/^[$escaped_symbols\p{L}\p{N}]+$/iu";
答案 1 :(得分:0)
您可以使用T-Regx library和automatically choses delimiters中的handles unsafe characters:
$allow_symbols = './*!@%&[]:,-_ ';
Pattern::prepare(['^[', [$allow_symbols], '\p{L}\p{N}]+$'], 'iu')->match('');