You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('&amp;', '&amp;', $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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:27:32