ob_get_contents() - 从open body标签获取数据以关闭body标签

时间:2014-12-07 23:24:06

标签: php

快速提问,有没有办法明确指出要从php中的ob_get_contents()中提取哪些内容。

我有以下代码..但仍然没有运气..

$no = mt_rand(100,10000);    
$page = ob_get_contents();  
$custompage = preg_match('/<body[^>]+./','', $page);
ob_end_clean();

$filename1 = $no.'doc.html';

$f = fopen('./view/'.$filename1, "w"); 
fwrite($f, $custompage); 
fclose($f);     

我想要的是只选择从php脚本生成的html(在body标签之间)并将其保存到文件中。保存文件有效。

任何帮助,将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:1)

简单的,

$match = "";
preg_match("/<body.+<\/body>/is", $page, $custompage);

print_r($custompage);

答案 1 :(得分:1)

正则表达式可能对此任务有点过分。假设您输出的页面中只有一个<body>和一个</body>子字符串,这是合乎逻辑的。

在这种情况下,我们所要做的就是确定这两者的字符串位置,并启动substr

$from = strpos($page, '<body>');
$to = strpos($page, '</body>');

$contents = substr($page, $from, $to - $from);

但是,这会包含<body></body>标记。

答案 2 :(得分:0)

您可以通过DOM API执行此操作:

只需以这种方式加载您的页面代码:

$dom = new DOMDocument();
$dom->loadHTML($page);

然后获取正文&#34;节点&#34; (因为只有一个body元素,我们可以使用item(0)):

$body = $dom->getElementsByTagName('body')->item(0);

然后您可以以规范化形式输出正文:

echo $body->C14N();

或者只是以这种方式输出正文XML代码:

echo $dom->saveXML($body);

只需使用file_put_contents将其保存在您想要的任何位置,以便您的代码可以只是:

$dom = new DOMDocument();
$dom->loadHTML($page);
file_put_contents(
    "myfile.html",
    $dom->getElementsByTagName('body')->item(0)->C14N()
);

这将保留body元素,因为DOM文档必须有根,但您可以通过存储每个子节点来摆脱它:

$dom = new DOMDocument();
$dom->loadHTML($page);
$content = "";
foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $child) {
    $content .= $dom->saveXML($child);
}
file_put_contents("myfile.html", $content);

代码比其他解决方案多一些,但据我所知,这样做会更加干净。

相关问题