我正在使用包含带有“\ 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
答案 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"