Разобрать HTML с PHP, чтобы получить элементы одного уровня, сгруппированные по классам. - PullRequest
1 голос
/ 31 августа 2011

У меня ОГРОМНЫЙ HTML-документ, который мне нужно проанализировать. Документ представляет собой список <p> элементов всех (прямых) дочерних элементов тега body. Разница заключается в названии класса. Структура выглядит так:

    <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>

Как, черт возьми, я могу это сделать, пожалуйста? Спасибо.

Ответы [ 4 ]

2 голосов
/ 31 августа 2011

Использование XPath:

//p[not(@class='first-level')][not(@class='second-level')][not(@class='third-level')]

чтобы получить (не?) Совпадающие узлы, тогда вы можете использовать этот ответ , чтобы получить externalHTML узлов.

1 голос
/ 31 августа 2011

Дополнительно, если вы знакомы с jQuery, попробуйте порт jQuery для PHP , и вы можете иметь мощный набор инструментов для сопоставления набора элементов в документе (селекторы), как вы привыкли быть с jQuery вместе с иерархией, фильтрами атрибутов, дочерними фильтрами и т. д., ссылка

0 голосов
/ 31 августа 2011
$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}>";
}
0 голосов
/ 31 августа 2011

Вы можете открыть файл (с помощью fopen или чего-то подобного) и читать по одной строке за раз.Затем просто проверьте, находится ли нужная строка в строке (например, с помощью strstr), и если да, то добавьте ее в массив или сделайте то, что вам нужно, со строкой.Примечание: это работает, только если абзацы находятся в разных строках.

fopen документация

strstr документация

...