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

Posted

技术标签:

【中文标题】使用 PHP 匹配 html <body> 标签之间的所有内容【英文标题】:Matching everything between html <body> tags using PHP 【发布时间】:2011-01-12 01:47:16 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

查看有关使用正则表达式解析 html 的说明:***.com/questions/1732348/… 【参考方案1】:

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

【讨论】:

我知道这是一个古老的问题和答案,但是,这是一个比公认的解决方案更好的答案【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

如果由于某种原因你没有安装 DOMDocument,试试这个

第一步:下载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;

【讨论】:

仅供参考:当时它存在内存泄漏,并且在处理大页面时会终止整个请求。希望它现在已修复。

以上是关于使用 PHP 匹配 html <body> 标签之间的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 和 XPath 获取匹配正则表达式的 href

PHP文件上传

正则表达式在PHP中搜索多个匹配项

警告:预期的服务器 HTML 在 <div> 中包含匹配的 <body>

PHP 从回显输出中删除 <body><html>...</html></body>

PHP可变变量的简单使用