2

我正在使用一个包含带有“\uXXXX”的表达式的正则表达式数据库,这当然会破坏 PHP PCRE。

那么,两个部分的问题,有没有办法告诉 PCRE 接受这些序列?

我解决了这个问题,幸运的是,这只是一个序列,方法是:

$regx = str_ireplace('\u00a7', '\xa7', $regx);

但是当我试图这样做时:

$regx = preg_replace("/\\u(\w+)/i", "\x$1", $regx);

我仍然得到 -

警告:preg_replace() [function.preg-replace]:编译失败:PCRE 在偏移量 1 处不支持 \L、\l、\N{name}、\U 或 \u

它需要双重转义 \u => \\\\u,而不仅仅是 \\u,为什么/有更好的方法?注意:我实际上必须做同样的事情,更重要的是,才能将正确的字符串放入这篇文章。

更新:在我们的服务器上运行 5.3.3

4

2 回答 2

1
$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 没有意义,所以它不会解析它。这是很有帮助的行为,但是当它出错时确实会让事情变得更加混乱,就像在这种情况下一样。

于 2013-02-04T15:14:11.730 回答
1

\u 不适用于 PHP,但 \x 可以。PCRE文档的解释:

\x{hhh..} character with hex code hhh.. (non-JavaScript mode)
\uhhhh    character with hex code hhhh (JavaScript mode only)

修饰符 u 不应该被遗忘。(“Javascript 模式”是一个“内部”标志)

另一种解释 Unicode 序列(\u 为 \U)的解决方案是使用 intl/Transliterator(PHP >= 5.4):

$in = '\u0041\U00000062';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(2) "Ab"
于 2013-02-04T16:28:11.330 回答