php - 函数 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时,它工作正常。
那么,这是怎么回事以及如何处理呢?
解决方案
preg_quote
默认情况下不会转义正则表达式的分隔符,因为它可以是任何非字母数字、非反斜杠、非空白字符。
将其第二个参数 ( $delimiter
) 设置为也转义正斜杠:
$escaped_symbols = preg_quote($allow_symbols, '/');
$pattern = "/^[$escaped_symbols\p{L}\p{N}]+$/iu";
推荐阅读
- php - Xdebug - “jit”不适用于 PhpStorm
- windows - 批量删除旧行
- c# - C# TableEntity 在插入操作后保持 IgnoredProperty
- python - 插入列的索引与框架索引不兼容
- java - 从 Spring Data JPA 查询方法返回自定义集合
- cpu-usage - 来自跟踪的 CPU 使用率/利用率计算
- sql - 当我尝试使用 ROW_NUMBER() 时出现错误,为什么?
- c++ - C++11 特性 std::map::at 在旧版本的 C++ 上编译
- c# - 如何将 IEnumerable 与 Process.Start 的输出事件处理程序一起使用?
- java - FirebaseListAdapter 无法应用