5

我有一个脚本,它在一个名为 $content 的变量中返回以下内容

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

但是,我需要将body标签之间的所有内容放在一个名为matches的数组中

我做了以下来匹配body标签之间的东西

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

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

4

3 回答 3

12

不要试图用正则表达式处理 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();
于 2010-02-02T09:08:04.007 回答
10

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

在这种情况下,您的特殊问题是您需要添加DOTALL 修饰符,以便点与换行符匹配。

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

但说真的,请改用 HTML 解析器。上面的正则表达式可以破坏的方式有很多。

于 2010-02-02T09:05:26.413 回答
2

如果由于某种原因你没有安装 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;
于 2010-02-02T09:17:31.570 回答