我想将字符串格式的一组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实体的具体解决方案吗?
答案 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
等形式的字符串。答案 1 :(得分:1)
这个标题为page here的Escaping 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_encode
和json_decode
一起使用纯UTF-8并将其转换为Unicode。非常好的技术。但是对于你的例子,这可行。
$str = '\u304a\u306f\u3088\u3046';
echo preg_replace('/\\\u([0-9a-z]{4})/', '&#x$1;', $str);
输出结果为:
おはよう
这是:
おはよう
转换为:
早上好