PHP PCRE unicode 转义

标签 php unicode pcre unicode-escapes

我正在使用一个正则表达式数据库,其中包含带有“\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/

相关文章:

c++ - GCC、std::ctype 特化和流

javascript - 每种语言的字体大小

objective-c - Unicode 字符在 iOS5 中的绘制方式不同

带或不带破折号的正则表达式匹配校验和

php - 在 PHP 中构建一个真正的面向对象的框架,需要建议

php - mysql 数据库连接

PHP 查询返回为 'Array' 而不是数据库中的名称

php - 如何在不知道索引值名称的情况下打印数组的值

.* 上的正则表达式前瞻

regex - 用正则表达式匹配时间字符串