我正在尝试从HTML字符串中枚举超链接列表(特别是HREF组件)。雅虎的早期版本看起来与每个页面的内容相差不远(一系列超链接分为LI和UL标签分组。
我们正在从旧系统解析一系列以前手工制作的HTML页面,并希望仅从每个页面中提取有意义的内容,而不是迁移整个字符串。在我的测试中,我的过程很简单,如下所示:
我很确定这样做的最好方法是使用正则表达式,但是从我在堆栈溢出时可以找到的示例中我无法使它们正常工作(甚至可以回显找到的匹配项) DOM Parser也没有太大的成功。
我的测试数据如下所示:
<html>
<body>
<li><a href='beforelist.com'></a></li>
<ul class="summary">
<li><a href='test.com'></a></li>
<li><a href='test2.com'></a></li>
<li><a href='etc.com'></a></li>
</ul>
<li><a href='afterlist.com'></a></li>
<img src='/test.png'>
</body>
</html>
我正在寻找匹配的输出(只有在找到class ='summary'之后:
test.com
test2.com
etc.com
摘要分组之外的所有内容都会被忽略,并且对于它可能包含的内容非常不可预测。我确信我错过了一些明显的东西,非常感谢任何帮助!我从来没有真正理解如何正确编写正则表达式模式。 :)
答案 0 :(得分:0)
方法是使用DOMDocument
,而DOMXPath
永远不会使用正则表达式解析HTML。
以下是您案例的简单示例:
// Create new DOM
$dom = new DOMDocument();
// Import your HTML string into DOM
$dom->loadHTML($html);
// Create new XPath which has the above DOM as resource
$xpath = new DOMXPath($dom);
// Find every ul with class summary and select all the "a"s in it
$links = $xpath->query("//ul[@class='summary']//a");
// Loop through the links
foreach($links as $link) {
// Print out the href attribute
var_dump($link->getAttribute('href'));
}
这个小PHP片段的输出是:
string 'test.com' (length=8)
string 'test2.com' (length=9)
string 'etc.com' (length=7)
真的很容易。 XPath查询将查找包含类summary
的无序列表中的所有链接。即使它是嵌套列表。
答案 1 :(得分:0)
带解释的代码:
<?php
// to retrieve selected html data, try these DomXPath examples:
$html="<html>
<body>
<li><a href='beforelist.com'></a></li>
<ul class='summary'>
<li><a href='test.com'></a></li><li><a href='test2.com'></a></li><li><a href='etc.com'></a></li>
</ul>
<li><a href='afterlist.com'></a></li>
<img src='/test.png'>
</body>
</html>";
$doc = new DOMDocument;
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
// example 1: for everything with an id
//$elements = $xpath->query("//*[@id]");
// example 2: for node data in a selected id
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']");
// example 3: what you are looking for
$elements = $xpath->query("//ul[@class='summary']//li/a");
if (!is_null($elements)) {
foreach ($elements as $element) {
echo $element->getAttribute('href'). "\n";
}
}
?>