2014-12-07 47 views
0

快速的问题,有没有一种方法可以明确指定从php中的ob_get_contents()提取什么内容。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标签之间),并将其保存到一个文件中。保存文件的作品。

任何帮助,将不胜感激。

谢谢

+0

所以......你需要''和''之间的HTML? – 2014-12-07 23:31:49

+0

@JánosWeisz是的,那正是我需要的。目前,我得到整个页面...从HTML标记到关闭HTML标记 – rob 2014-12-07 23:33:01

回答

1

正则表达式可能是承担这一任务的矫枉过正。假设在输出页面中只有一个<body>和一个</body>子字符串是合乎逻辑的。

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

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

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

然而这将包括在<body></body>标签。

+1

如果body是 'body id =“tesT”onload =“hello();”>'等等。其实,开销并不是那么糟糕,特别是如果用于缓存 – DdD 2014-12-07 23:36:41

+0

@DimitriAdamou良好的捕获。我不知道这一点。我试图避免使用正则表达式的原因是由于在问题中缺少标签。 – 2014-12-07 23:39:23

+2

只需从最初的'from'删除尾部的'>',并且应该满足@ DimitriAdamou的情况。 – rfoo 2014-12-08 00:03:28

1

简单的一个,

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

print_r($custompage); 
+0

这给了我一个数组 – rob 2014-12-07 23:45:55

+0

是的,你只是做$ custompage [0],这是preg_match的行为。 http://php.net/manual/en/function.preg-match.php 你不能这样做'$ string = preg_match(...);'因为preg_match在匹配时返回1,否则返回0。 – DdD 2014-12-08 00:17:50

0

你可以做到这一点通过DOM API:

只需加载页面的代码是这样的:

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

然后取人体“节点”(因为只有一个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); 

代码比其他解决方案多一点,但根据我的说法,这样做更简单。