如何使用PHP的preg_replace函数将Unicode代码点转换为实际字符/ HTML实体?

时间:2014-01-05 07:15:04

标签: php regex unicode preg-replace html-entities

我想将字符串格式的一组Unicode代码点转换为实际字符和/或HTML实体(结果很好)。

例如,如果我有以下字符串赋值:

$str = '\u304a\u306f\u3088\u3046';

我想使用preg_replace函数将这些Unicode代码点转换为实际字符和/或HTML实体。

根据我发现的类似问题的其他Stack Overflow帖子,我首先尝试了以下内容:

$str = '\u304a\u306f\u3088\u3046';
$str2 = preg_replace('/\u[0-9a-f]+/', '&#x$1;', $str);

但是,每当我尝试这样做时,都会收到以下PHP错误:

  

警告:preg_replace()[function.preg-replace]:编译失败:PCRE不支持\ L,\ l,\ N,\ U或\ u

我尝试了各种各样的事情,例如在正则表达式中添加u标记或将/\u[0-9a-f]+/更改为/\x{[0-9a-f]+}/,但似乎没有任何效果。

另外,我已经查看了我在网上可以找到的各种其他相关页面/帖子,这些页面/帖子与将PHP代码点转换为PHP中的实际字符有关,但要么我缺少一些关键的东西,要么出错了,因为我无法解决我遇到的问题。

有人可以给我一个关于如何将一串Unicode代码点转换为实际字符和/或一串HTML实体的具体解决方案吗?

2 个答案:

答案 0 :(得分:6)

来自PHP manual

  

单引号和双引号PHP字符串具有反斜杠的特殊含义。因此,如果必须将\与正则表达式\\匹配,则必须在PHP代码中使用"\\\\"'\\\\'

首先,在正则表达式中,您只使用一个反斜杠(\)。如PHP手册中所述,您需要使用\\\\来匹配文字反斜杠(with some exceptions)。

其次,您缺少原始表达式中的捕获组。 preg_replace()在给定字符串中搜索与提供的模式匹配的字符串,并返回字符串,其中捕获组匹配的内容将替换为替换字符串。

具有正确转义和正确捕获组的更新正则表达式如下所示:

$str2 = preg_replace('/\\\\u([0-9a-f]+)/i', '&#x$1;', $str);

输出:

おはよう

表达式: \\\\u([0-9a-f]+)

  • \\\\ - 匹配文字反斜杠
  • u - 匹配文字u字符
  • ( - 捕获组的开始
    • [0-9a-f] - 字符类 - 匹配一个数字(0 - 9)或字母(来自a - f)一次或多次
  • ) - 捕获群组结束
  • i修饰符 - 用于不区分大小写的匹配

替换 &#x$1

  • & - 文字&符号(&
  • # - 字面字符(#
  • x - 字面字符x
  • $1 - 第一个捕获组的内容 - 在本例中为304a等形式的字符串。

RegExr Demo.

答案 1 :(得分:1)

这个标题为page hereEscaping Unicode Characters to HTML Entities in PHP似乎用这个好功能解决了这个问题:

function unicode_escape_sequences($str){
  $working = json_encode($str);
  $working = preg_replace('/\\\u([0-9a-z]{4})/', '&#x$1;', $working);
  return json_decode($working);
}

这似乎与json_encodejson_decode一起使用纯UTF-8并将其转换为Unicode。非常好的技术。但是对于你的例子,这可行。

$str = '\u304a\u306f\u3088\u3046';
echo preg_replace('/\\\u([0-9a-z]{4})/', '&#x$1;', $str);

输出结果为:

おはよう

这是:

  

おはよう

转换为:

  

早上好