WordPress PHP插件字符编码异常问题求助
WordPress插件版权字符串提取的编码问题及解决思路
问题描述
我正在开发一款WordPress插件,用于提取指定网站URL中的版权字符串。目标网站HTML中的版权字符串为:
"© 2024 • Printing & Publishing Co., Inc. • All Rights Reserved"
但在PHP插件中获取到的字符串显示为:
"u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
这看起来是缺少前导反斜杠或0x标识的UTF-16编码形式。我的iconv扩展输入、输出及内部编码均配置为UTF-8,目标网站也声明了UTF-8字符集。尝试过html_entity_decode、mb_convert_encoding、正则匹配'/u([0-9a-fA-F]{4})/'等多种转码方法,但都无效,仍得到上述异常格式的字符串。目前用替换特殊字符的临时方案凑合用,但想找到更优雅的解决办法。
核心代码片段
$response = wp_remote_get($url); $html = wp_remote_retrieve_body($response); $regex = "/>[^>]*© [0-9]{4}[^<]*</"; if (preg_match($regex, $html, $matches) === 1) { foreach ($matches as $match){ $string = html_entity_decode($match); $string = str_replace('©', '(c)', $string); $string = str_replace('•', '-', $string); $string = str_replace('–', '-', $string); $string = str_replace('&', '&', $string); $string = str_replace('®', '(r)', $string); $result = trim(str_replace(">", "", str_replace("<", "", $string))); } }
插件通过curl调用获取内容,最终用WP_REST_Response返回结果。
后续根因发现
后来发现问题并非出在插件代码本身,而是处理插件返回JSON的方式,使用jq工具可以解决,但仍希望获取相关编码处理的技术指导。
编码处理技术指导
- 修复不完整的Unicode转义:遇到
u00a9这类缺失前导反斜杠的转义字符,可通过正则补全后用json_decode解析,示例代码:$fixedString = preg_replace('/u([0-9a-fA-F]{4})/', '\u$1', $rawString); $decodedString = json_decode('"' . $fixedString . '"'); - 正则匹配的UTF-8模式:PHP正则处理UTF-8字符时,需在表达式末尾添加
u修饰符,确保PCRE引擎正确识别UTF-8编码:$regex = "/>[^>]*© [0-9]{4}[^<]*</u"; - 优先使用DOM解析:正则提取HTML内容易出错,建议用
DOMDocument+DOMXPath解析,示例:$dom = new DOMDocument(); @$dom->loadHTML($html); // 抑制非标准HTML的解析警告 $xpath = new DOMXPath($dom); // 定位包含版权信息的节点(示例为footer下含©的p标签) $copyrightNodes = $xpath->query("//footer//p[contains(text(), '©')]"); if ($copyrightNodes->length > 0) { $copyrightText = $copyrightNodes->item(0)->nodeValue; // 后续处理逻辑 } - JSON序列化一致性:使用
WP_REST_Response返回结果时,WordPress会自动处理JSON序列化,避免手动拼接JSON字符串;外部工具处理返回结果时,必须用标准JSON解析器确保转义字符被正确解析。
内容的提问来源于stack exchange,提问作者BrownWolf
相关产品推荐
相关产品推荐

