使用PHP解析HTML以获取按类分组的兄弟元素

时间:2011-08-31 18:27:04

标签: php html-parsing

我有一个需要解析的巨大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-levelsecond-levelthird-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>

请问我该怎么办? 谢谢。

4 个答案:

答案 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)

您可以打开文件(使用fopen或类似内容)并一次读取一行。然后检查所需的字符串是否在行中(例如使用strstr),如果是,则将其添加到数组中或使用该行执行所需操作。 注意:这仅适用于段落各自不同的行。

fopen文档

strstr文档