我正在使用regexp数据库,其中包含带有"\uXXXX“的表达式,这当然会破坏PCRE。
那么,有两个部分的问题,有没有办法告诉PCRE接受这些序列?
我解决了这个问题,幸运的是,这只是一个序列,通过做:
$regx = str_ireplace('\u00a7',‘\xa7 7’,$regx);
但当我试图做的时候:
$regx = preg_replace("/\u(\w+)/i",“x$1”,$regx);
我还是.
警告: preg_replace() Function.preg-替换:编译失败: PCRE不支持\L、\l、\N{name}、\U或偏移量1处的\u
它需要双倍逃离\u => \\u,而不仅仅是\u,为什么有更好的方法呢?注意:实际上,我必须做同样的事情,更重要的是,要在这篇文章中得到正确的字符串。
更新:在我们的服务器上运行5.3.3
发布于 2013-02-04 15:14:11
$regx = preg_replace("/\\u(\w+)/i", "\x$1", $regx);这不起作用的原因是你需要双倍逃离反斜杠。
就目前情况而言,\\u位于PHP双引号字符串中,这意味着\\由PHP向下转义到一个斜杠。
然后,这个单独的斜杠被赋予PRCE,因此regex解析器只看到\u。这将失败,因为\u不是regex中的有效转义序列。
如果要实际匹配PHP正则表达式中的反斜杠字符,则需要实际提供四个反斜杠。
$regx = preg_replace("/\\\\u(\w+)/i", "\x$1", $regx);是啊。太难看了。但事实就是这样。
从技术上讲,这适用于任何regex反斜杠,因此在理论上,您的\w也应该有一个双反斜杠,但是您可以不使用该反斜杠,因为\w对PHP没有任何意义,所以它不会解析它。这是有益的行为,但当它出错时,确实会使事情更加混乱,就像在这种情况下一样。
发布于 2013-02-04 16:28:11
您不会使用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 as \U)的另一种解决方案是使用intl/转写器(PHP >= 5.4):
$in = '\u0041\U00000062';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(2) "Ab"https://stackoverflow.com/questions/14689567
复制相似问题