我有一个需要解析的巨大HTML文档。
该文档是正文标记的所有(直接)子元素的<p>
元素列表。
不同的是班级名称。结构是这样的:
<p class="first-level"></p>
<p class="second-level"></p>
<p class="third-level"></p>
<p class="third-level"></p>
<p class="nth-levels just-for-demo-1"></p>
<p class="nth-levels just-for-demo-1"></p>
<p class="third-level"></p>
<p class="second-level"></p>
<p class="third-level"></p>
<p class="nth-levels just-for-demo-2"></p>
<p class="first-level"></p>
<p class="second-level"></p>
<p class="second-level"></p>
<p class="third-level"></p>
等等。第n级可以是任何不是first-level
,second-level
或third-level
的类名。
基本上它是一个非常难以标记的多级<ul>
元素。
我想要做的就是解析它并获取上面某个类名之间的所有<p>
元素(包括标记,而不仅仅是innerHTML)。
在上面的例子中,我想得到:
<p class="nth-levels just-for-demo-1"></p>
<p class="nth-levels just-for-demo-1"></p>
和
<p class="nth-levels just-for-demo-2"></p>
请问我该怎么办? 谢谢。
答案 0 :(得分:2)
使用XPath:
//p[not(@class='first-level')][not(@class='second-level')][not(@class='third-level')]
获取(非?)匹配节点,然后您可以使用this answer来获取节点的outerHTML。
答案 1 :(得分:1)
另外,如果你熟悉jQuery,那么试试jQuery port to PHP你就可以拥有一套强大的工具来匹配文档中的一组元素(选择器),就像你以前一样使用jQuery使用层次结构,属性过滤器,子过滤器等,Reference
答案 2 :(得分:0)
$doc = new DOMDocument;
$doc->loadHTML(...);
$query = '//p[contains(@class, "just-for-demo-")]';
$xpath = new DOMXPath($doc);
$entries = $xpath->query($query);
foreach ($entries as $entry)
{
// not a best solution yet
$attribute = '';
foreach ($entry->attributes as $attr)
{
$attribute .= "{$attr->name}=\"{$attr->value}\"";
}
echo "<{$entry->nodeName}{$attribute}>{$entry->nodeValue}</{$entry->nodeName}>";
}
答案 3 :(得分:-1)