PHP Xpath - Разбор плоской структуры HTML - PullRequest
4 голосов
/ 07 ноября 2011

Я пытаюсь разобрать довольно плоский HTML и сгруппировать все от одного тега h1 до следующего. Например, у меня есть следующий HTML:

<h1> Heading 1 </h1>
<p> Paragraph 1.1 </p>
<p> Paragraph 1.2 </p>
<p> Paragraph 1.3 </p>
<h1> Heading 2 </h1>
<p> Paragraph 2.1 </p>
<p> Paragraph 2.2 </p>
<h1> Heading 3 </h1>
<p> Paragraph 3.1 </p>
<p> Paragraph 3.2 </p>
<p> Paragraph 3.3 </p>

Я хочу, чтобы это выглядело так:

<div id='1'>
    <h1> Heading 1 </h1>
    <p> Paragraph 1.1 </p>
    <p> Paragraph 1.2 </p>
    <p> Paragraph 1.3 </p>
</div>
<div id='2'>
    <h1> Heading 2 </h1>
    <p> Paragraph 2.1 </p>
    <p> Paragraph 2.2 </p>
</div>
<div id='3'>
    <h1> Heading 3 </h1>
    <p> Paragraph 3.1 </p>
    <p> Paragraph 3.2 </p>
    <p> Paragraph 3.3 </p>
</div>

Вероятно, даже не стоит публиковать код, который я сделал до сих пор, поскольку он просто превратился в беспорядок. В основном я пытался сделать запрос Xpath для '// h1'. Создайте новые теги DIV в качестве родительских узлов. Затем скопируйте узел DOM h1 в первый DIV, а затем переберите nextSibling, пока я не нажму еще один тег h1 - как уже упоминалось, он запутался.

Может ли кто-нибудь указать мне лучшее направление?

1 Ответ

3 голосов
/ 07 ноября 2011

Перебирайте все узлы, находящиеся на одном уровне (в моем примере я создал узел подсказки с именем platau), всякий раз, когда вы запускаете <h1>, вставляйте div перед и сохраняйте ссылку на него.

Для <h1> и любого другого узла и, если ссылка существует, удалите узел и добавьте его в качестве дочернего для ссылки.

Пример:

$doc->loadXML($xml);
$xp = new DOMXPath($doc);

$current = NULL;
$id = 0;
foreach($xp->query('/platau/node()') as $i => $sort)
{
    if (isset($sort->tagName) && $sort->tagName === 'h1')
    {
        $current = $doc->createElement('div');
        $current->setAttribute('id', ++$id);
        $current = $sort->parentNode->insertBefore($current, $sort);
    }
    if (!$current) continue;

    $sort->parentNode->removeChild($sort);
    $current->appendChild($sort);
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...