使用PHP匹配html标签之间的所有内容

时间:2010-02-02 08:59:51

标签: php regex html-parsing

我有一个脚本,它在名为$ content

的变量中返回以下内容
<body>
<p><span class=\"c-sc\">dgdfgdf</span></p>
</body>

但是我需要将body标签放在名为matches

的数组中

我执行以下操作来匹配body标签

之间的内容
preg_match('/<body>(.*)<\/body>/',$content,$matches);

但是$ mathces数组是空的,我怎么能让它返回body标签内的所有内容

3 个答案:

答案 0 :(得分:12)

Don't try to process html with regular expressions!请改用PHP's builtin parser

$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();

答案 1 :(得分:10)

您不应该使用正则表达式来解析HTML。

在这种情况下,您需要添加DOTALL modifier,以便点匹配换行符。

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

但严重的是,请改用HTML解析器。上述正则表达式有很多种方法可以破解。

答案 2 :(得分:2)

如果由于某种原因您没有安装DOMDocument,请尝试使用

步骤1.下载simple_html_dom

步骤2.阅读有关如何use its selectors

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