Сопоставление всего между тегами html <body>с использованием PHP - PullRequest
5 голосов
/ 02 февраля 2010

У меня есть скрипт, который возвращает следующее в переменной с именем $ content

<body>
<p><span class=\"c-sc\">dgdfgdf</span></p>
</body>

Мне, однако, нужно поместить все между тегом body внутри массива с именем match

Я делаю следующее, чтобы найти соответствие между тегом body

preg_match('/<body>(.*)<\/body>/',$content,$matches);

но массив $ mathces пуст, как я могу заставить его возвращать все внутри тега body

Ответы [ 3 ]

12 голосов
/ 02 февраля 2010

Не пытайтесь обрабатывать html с регулярными выражениями ! Используйте встроенный синтаксический анализатор PHP вместо:

$dom = new DOMDocument;
$dom->loadHTML($string);
$bodies = $dom->getElementsByTagName('body');
assert($bodies->length === 1);
$body = $bodies->item(0);
for ($i = 0; $i < $body->children->length; $i++) {
    $body->remove($body->children->item($i));
}
$string = $dom->saveHTML();
10 голосов
/ 02 февраля 2010

Вы не должны использовать регулярные выражения для разбора HTML.

Ваша конкретная проблема в этом случае заключается в том, что вам нужно добавить модификатор DOTALL , чтобы точка соответствовала символам новой строки.

preg_match('/<body>(.*)<\/body>/s', $content, $matches);

А если серьезно, используйте вместо этого анализатор HTML. Существует так много способов, которыми вышеприведенное регулярное выражение может сломаться.

2 голосов
/ 02 февраля 2010

Если по какой-то причине у вас не установлен DOMDocument, попробуйте это

Шаг 1. Скачать simple_html_dom

Шаг 2. Прочитайте документацию о том, как использовать его селекторы

require_once("simple_html_dom.php");
$doc = new simple_html_dom();
$doc->load($someHtmlString);
$body = $doc->find("body")->innertext;
...