获取没有DOCTYPE,HTML,HEAD和BODY标签的BODY内容

时间:2012-06-29 00:15:21

标签: php

我想要做的是在PHP系统中包含一个HTML文件(不是问题),但由于各种原因,HTML文件也需要单独使用,所以我需要知道如何剥离如果可能的话,在PHP的上下文中包含doctype,html,head和body标签。

我不是特别擅长PHP(doh!)所以我对php手册和网络的搜索并没有让我想到这一点。这意味着非常感谢任何帮助或阅读提示,或两者兼而有之。

8 个答案:

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

http://codepad.org/MQVQ3XQP

任何人都希望看到“其他人”,请参阅修订版。

答案 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)

作为 miken32 said

<块引用>

嘿,为什么不回答一个 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;
    }