我正在使用一个正则表达式数据库,其中包含带有“\uXXXX”的表达式,这当然会破坏 PHP PCRE。
那么,问题分为两部分,有没有办法告诉 PCRE 接受这些序列?
我解决了这个问题,幸运的是这只是一个序列,通过这样做:
$regx = str_ireplace('\u00a7', '\xa7', $regx);
但是当我尝试这样做时:
$regx = preg_replace("/\\u(\w+)/i", "\x$1", $regx);
我仍然得到 -
Warning: preg_replace() [function.preg-replace]: Compilation failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
并且需要两次转义\u =>\\\\u,而不是简单的\\u,为什么/有更好的方法吗?注意:实际上我必须做同样的事情,而且更重要的是,才能将正确的字符串放入这篇文章中。
更新:在我们的服务器上运行 5.3.3
最佳答案
$regx = preg_replace("/\\u(\w+)/i", "\x$1", $regx);
这不起作用的原因是你需要双重转义反斜杠。
就目前情况而言,\\u
位于 PHP 双引号字符串内,这意味着 \\
被 PHP 转义为单个斜杠。
然后将这个单斜杠赋予 PRCE,因此正则表达式解析器只会看到 \u
。此操作失败,因为 \u
不是正则表达式中的有效转义序列。
如果您想实际匹配 PHP 正则表达式中的反斜杠字符,则需要实际提供四个反斜杠。
$regx = preg_replace("/\\\\u(\w+)/i", "\x$1", $regx);
是的。它很丑。但事实就是如此。
从技术上讲,这适用于任何正则表达式反斜杠,因此理论上您的 \w
也应该有一个双反斜杠,但您可以摆脱它,以及大多数其他反斜杠,因为 \w
对 PHP 没有任何意义,因此不会解析它。这是有用的行为,但当出现问题时,确实会让事情变得更加困惑,就像在本例中一样。
关于PHP PCRE unicode 转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14689567/