PHP PCRE unicode逃脱

时间:2013-02-04 15:08:02

标签: php unicode pcre unicode-escapes

我正在使用包含带有“\ uXXXX”的表达式的regexp数据库,这当然会破坏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,为什么那是/有更好的方法吗?注意:我实际上必须做同样的事情,更重要的是,要在这篇文章中找到正确的字符串。

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

2 个答案:

答案 0 :(得分: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,所以它不解析它。这是一种有用的行为,但在出现问题时确实会让事情变得更加混乱,就像在这种情况下一样。

答案 1 :(得分:1)

\ u不能用PHP,但是\ x会。 PCRE文档的解释:

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

不应忘记修饰语。 (“Javascript模式”是“内部”标志)

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

$in = '\u0041\U00000062';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(2) "Ab"