首页 > 解决方案 > 函数 preg_quote 工作不正确?

问题描述

假设我想检查输入以允许 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时,它工作正常。

那么,这是怎么回事以及如何处理呢?

标签: phpregex

解决方案


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

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

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

推荐阅读