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

如何通过PHP DOMDocument修改维基百科信息框红链的href属性

问题根源

替换失效核心是两个问题:

  • 你用str_ireplace做字符串替换的方案本身就不稳定:之前替换/wiki/开头的链接能生效,只是因为这类链接路径短、大多是纯ASCII字符没有特殊转义,属于碰巧能用。维基红链的href带?、&、=这类特殊URL字符,还有URL编码的多字节内容(比如法语的重音字符、非英文词条名),很容易出现字符串匹配不上的情况。
  • 硬匹配href特征兼容性差:不同语言版本维基的红链href格式可能有细微差别,只找/w/index.php?或者redlink=1很容易漏判。
实现方法

别用字符串替换改链接,直接通过DOM方法修改对应a节点的href属性即可。另外维基红链固定带new这个CSS类,直接判断类名比匹配href靠谱得多,不会漏也不会误判。如果只需要改信息框里的链接,可以先定位信息框节点再遍历内部链接,避免改到页面其他地方的内容。

可直接运行的代码如下:

libxml_use_internal_errors(true);
$parser = new DOMDocument();
$parser->loadHTMLFile("https://fr.wikipedia.org/wiki/Alibaba_Group");

$xpath = new DOMXPath($parser);
// 下面这行是只筛选信息框内的红链,要全页面替换红链的话把查询规则改成'//a[contains(@class, "new")]'即可
$red_links = $xpath->query('//table[contains(@class, "infobox")]//a[contains(@class, "new")]');

foreach ($red_links as $link) {
    $term = trim($link->nodeValue);
    if (empty($term)) continue;
    $new_url = BASE_PATH . "search.php?term=" . urlencode($term) . "&type=sites";
    // 直接修改DOM节点的href属性,不需要做字符串替换
    $link->setAttribute('href', $new_url);
}

// 最终输出修改后的完整HTML即可
$wikipediaInfoboxTable = $parser->saveHTML();
关键注意点
  • 用DOMXPath按class筛选红链,比匹配href特征准确率高,不会出现漏判、误判。
  • 直接调用setAttribute修改属性,完全绕开字符串替换的匹配问题,不管href里有什么特殊字符都能正确修改。
  • 拼接搜索链接时对$term做urlencode处理,避免空格、特殊字符、多字节文字导致生成的链接格式失效。
  • 先定位infobox节点再遍历,只会修改你需要的信息框内的AutoNavi、UCWeb、AGTech Holdings Limited这类红链,不会改动页面其他位置的链接。

内容的提问来源于stack exchange,提问作者user7962781

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:45:52