Уберите HTML, которого нет в тегах - PullRequest
1 голос
/ 15 февраля 2011

В настоящее время я очищаю веб-сайт и имею все полезные данные, которые мне нужны, хотя он содержит немного данных, которые мне не нужны.

Пример:

<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>

Итак, я хочу удалить весь текст, который не заключен ни в теги h2, ни в p.

Есть ли легкая функция / preg?

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Самый хороший способ сделать это с помощью класса PHP DOMDocument. Это очень похоже на ответ Марио , за исключением того, что для него не требуется совершенно новая библиотека.

$doc = new DOMDocument;
$doc->loadXML('<root>' . $yourContent . '</root>');

$nodes = $doc->firstChild->childNodes;

$output = '';
for ($i = 0; $i < $nodes->length; $i++) {
    $node = $nodes->item($i);
    if ($node->nodeType !== XML_TEXT_NODE) {
        $output .= $doc->saveXML($node);
    }
}

echo $output;
1 голос
/ 15 февраля 2011

Самым ленивым решением было бы использование phpQuery или QueryPath с просто:

foreach (qp($html)->find("body *") as $node) {
    echo $node->html(), "\n";
}

Он перебирает все теги ниже тела и неявно пропускает текстовые узлы. Так что вам просто нужно собрать полученные фрагменты -> html ().

0 голосов
/ 15 февраля 2011

Результаты немного лучше:

preg_match_all('~<h2>.*?<\/h2>|<p>.*?<\/p>~i', $str, $new);
...