PHP:恢复转义的Unicode字符[重复]
Posted
技术标签:
【中文标题】PHP:恢复转义的Unicode字符[重复]【英文标题】:PHP: reverting escaped unicode characters [duplicate] 【发布时间】:2021-05-09 01:19:06 【问题描述】:我必须将非 ASCII 字符编码为符号 \X--\
的文本解析,其中 --
是字符的 Unicode 编号。例如:
vis\XED\vel numa das imagens pr\XE9\vias \XE0\ administra\XE7\\XE3\o
应该转换成
visível numa das imagens prévias à administração
我可以像尼安德特人那样做:寻找“\X”,2 个字符后确认有“/”,用相应的字符替换整个内容,冲洗并重复,直到找不到更多匹配项。但是,肯定有更好的方法来做到这一点。
然后,我尝试使用正则表达式,这是我不太了解的东西。在 RegExr 上,我最终得到了符合我需要的正则表达式 '/\X\w2\/'。但是当我尝试将它与 preg_replace_callback() 一起使用时,特别是使用字符串 "/\\X\w2\\/"
作为正则表达式时,我收到“非法/不支持的转义序列”错误。我尝试了一些我在网上找到的其他正则表达式,无论是在这个网站上还是在其他地方,都无济于事。
最后,我也不太确定用适当的字符替换 Unicode 数字的最佳方法是什么。
所以,我的问题有两个:
• 查找转义字符的理想方法是什么?
• 如何从 Unicode 编号中获取 UTF 字符?
【问题讨论】:
一个问题——你的字符串不应该是administra\XE7\\XE3\o
,而不是administra\XE7\XE3\o
吗?
@El_Vanja 确实!感谢您指出我的错误。现在已经修好了。
对于 REGEX 表达式,您应该双转义反斜杠以使其工作。所以在 REGEX 编辑器中的双反斜杠需要在 php 中变成三重反斜杠。
第二部分见this question。
@El_Vanja 感谢您的帮助!如果没有它,我需要很长时间才能弄清楚这一点。
【参考方案1】:
首先,正如Right way to escape backslash [ \ ] in PHP regex? 中提到的,应该使用4 个斜线来匹配反斜线。因此,正则表达式变为"/\\\\X\\w2\\\\/"
。
至于解码,我找到的最简单的方法是将转义字符转换为 html 实体格式并使用 html_entity_decode() 函数。因此,代码最终如下:
function unescapeText(string $str)
return preg_replace_callback(
"/\\\\X\\w2\\\\/",
fn($m) => html_entity_decode('&#x'.substr($m[0], 2, 2).';', ENT_NOQUOTES, 'UTF-8'),
$str
);
最后一句忠告:一开始我遇到了一些麻烦,因为双引号将字符串转换为二进制;单引号将双反斜杠转义为 1(因此,\XE7\\XE3\
将变为 \XE7\XE3\
)。这导致了各种各样的问题。使用 Nowdoc 语法最终使文本按照我的意图进行了字面解释。
【讨论】:
以上是关于PHP:恢复转义的Unicode字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章
PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不转义捷克字符
whatsapp 是如何处理特殊字符、unicode 和 emoji 的
SyntaxError :( unicode错误)'unicodeescape'编解码器无法解码位置2-3的字节:截断 UXXXXXXXX转义[重复]