我想要做的是在PHP系统中包含一个HTML文件(不是问题),但由于各种原因,HTML文件也需要单独使用,所以我需要知道如何剥离如果可能的话,在PHP的上下文中包含doctype,html,head和body标签。
我不是特别擅长PHP(doh!)所以我对php手册和网络的搜索并没有让我想到这一点。这意味着非常感谢任何帮助或阅读提示,或两者兼而有之。
答案 0 :(得分:16)
由于substr()
方法对于某些人来说似乎太多了,所以这是一个DOM解析器方法:
$d = new DOMDocument;
$mock = new DOMDocument;
$d->loadHTML(file_get_contents('/path/to/my.html'));
$body = $d->getElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child){
$mock->appendChild($mock->importNode($child, true));
}
echo $mock->saveHTML();
任何人都希望看到“其他人”,请参阅修订版。
答案 1 :(得分:5)
使用DOMDocument来保存您需要的内容而不是删除您不需要的内容(PHP> = 5.3.6)
$d = new DOMDocument;
$d->loadHTMLFile($fileLocation);
$body = $d->getElementsByTagName('body')->item(0);
// perform innerhtml on $body by enumerating child nodes
// and saving them individually
foreach ($body->childNodes as $childNode) {
echo $d->saveHTML($childNode);
}
答案 2 :(得分:3)
$site = file_get_contents("http://www.google.com/");
preg_match("/<body[^>]*>(.*?)<\/body>/is", $site, $matches);
echo($matches[1]);
答案 3 :(得分:2)
使用DOM解析器。这没有经过测试,但应该做你想做的事情
$domDoc = new DOMDocument();
$domDoc.loadHTMLFile('/path/to/file');
$body = $domDoc->GetElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child){
echo $child->C14N(); //Note this cannonicalizes the representation of the node, but that's not necessarily a bad thing
}
如果你想避免使用cannonicalization,你可以使用this version(感谢@Jared Farrish)
答案 4 :(得分:2)
您可能希望使用PHP整理扩展来修复无效的XHTML结构(在这种情况下DOMDocument加载崩溃)并且还仅提取正文:
$tidy = new tidy();
$htmlBody = $tidy->repairString($html, array(
'output-xhtml' => true,
'show-body-only' => true,
), 'utf8');
然后将提取的主体加载到DOMDocument:
$xml = new DOMDocument();
$xml->loadHTML($htmlBody);
然后遍历,提取,移动XML节点等。并保存:
$output = $xml->saveXML();
答案 5 :(得分:0)
仅具有一个DOMDocument实例且没有循环的解决方案
$d = new DOMDocument();
$d->loadHTML(file_get_contents('/path/to/my.html'));
$body = $d->getElementsByTagName('body')->item(0);
echo $d->saveHTML($body);
答案 6 :(得分:0)
嘿,为什么不回答一个 9 岁的问题呢? PHP 5.4 版(已发布 3
在提出这个问题多年后)将 options
参数添加到
DomDocument::loadHTML()
。有了它,你可以做到这一点:
$dom = new DomDocument();
$dom->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
// do stuff
echo $dom->saveHTML();
我们传递两个常量:LIBXML_HTML_NODEFDTD
表示不添加文档类型定义,LIBXML_HTML_NOIMPLIED
表示不添加隐含元素,如 <html>
和 <body>
。
答案 7 :(得分:-1)
这可能是一个解决方案。我试过了,它工作正常。
function parseHTML(string) {
var parser = new DOMParser
, result = parser.parseFromString(string, "text/html");
return result.firstChild.lastChild.firstChild;
}