如何通过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
相关产品推荐
相关产品推荐

