如何使用DOM同时获取href属性值与文本内容?
PHP DOM 同时提取文本及内部的href属性
基础DOM操作实现
直接遍历<li>元素,检查其内部是否存在<a>标签,进而提取链接属性:
$html = '<ul><li><a href="https://example.com/page1">第一页</a></li><li><a href="https://example.com/page2">第二页</a></li><li>没有链接的项目</li></ul>'; $dom = new DOMDocument(); libxml_use_internal_errors(true); // 屏蔽HTML解析警告 $dom->loadHTML($html); libxml_clear_errors(); $liElements = $dom->getElementsByTagName('li'); $results = []; foreach ($liElements as $li) { // 获取当前<li>下的第一个<a>标签 $aTag = $li->getElementsByTagName('a')->item(0); $item = [ 'text' => trim($li->textContent), // 提取<li>的文本内容 'href' => null ]; // 如果存在<a>标签,提取其href属性 if ($aTag instanceof DOMElement) { $item['href'] = $aTag->getAttribute('href'); } $results[] = $item; } // 输出处理后的结果 foreach ($results as $res) { echo "文本内容:{$res['text']} | 链接地址:{$res['href']}\n"; }
XPath 精准匹配实现
用XPath可以更简洁地定位元素,适合结构复杂的HTML:
$html = '<ul><li><a href="https://example.com/page1">第一页</a></li><li><a href="https://example.com/page2">第二页</a></li><li>没有链接的项目</li></ul>'; $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors(); $xpath = new DOMXPath($dom); // 选择所有<li>节点 $liNodes = $xpath->query('//li'); $results = []; foreach ($liNodes as $node) { // 提取<li>的文本 $text = trim($node->textContent); // 提取<li>内部<a>的href属性,无则返回空字符串 $href = $xpath->evaluate('string(.//a/@href)', $node); $results[] = [ 'text' => $text, 'href' => $href ?: null ]; } // 输出结果 foreach ($results as $res) { echo "文本内容:{$res['text']} | 链接地址:{$res['href']}\n"; }
说明
- 两种方法都兼容
<li>内部有无<a>标签的情况 libxml_use_internal_errors(true)用来屏蔽DOM解析HTML时的警告(比如非标准HTML结构)- 提取结果以数组形式存储,方便后续业务处理(如存入数据库、生成JSON等)
内容的提问来源于stack exchange,提问作者Yogus
相关产品推荐
相关产品推荐

