php提取体标签内容

时间:2015-12-23 13:04:46

标签: php html html-parsing

我正在尝试应该很容易的事情,但我无法让它发挥作用。这让我想知道我是否使用了正确的工作流程。

我有一个简单的html页面,我将其作为帮助文件加载到桌面应用程序中。此页面没有菜单只是内容。 在我的网站上,我希望有一个更复杂的帮助系统。所以我想使用一个php文件,它会显示一个菜单,面包棒和页眉和页脚。 为了不复制我的帮助内容,我想加载原始的HTML帮助文件,并将其正文内容添加到我的增强帮助页面。

我正在使用此代码提取标题:

function getURLContent($filename){
    $url = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . $filename;
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc;
}

function getSingleElementValue($element){
  if (!is_null($element)) {
    $node = $element->childNodes->item(0);
    return $node->nodeValue;
  }
} 

$doc = getURLContent("test.html");
$title = getSingleElementValue($doc->getElementsByTagName('title')->item(0));
echo $title;

正确提取标题。

现在我尝试提取身体:

function getBodyContent($element){
  $mock = new DOMDocument;
  foreach ($element->childNodes as $child){
      $mock->appendChild($mock->importNode($child, true));
  }        
  return $mock->saveHTML();
}

$body = getBodyContent($doc->getElementsByTagName('body')->item(0));
echo $body;

getBodyContent()函数是我尝试过的几个选项之一。 所有这些都返回整个HTML标记,包括HEAD标记。

我的问题是:这是一个正确的工作流程还是应该使用别的东西?

感谢。

更新:我的最终目标是建立一个包含多个网页的网站,其中的帮助文件可通过菜单访问。这些页面将使用generate.php?page = test.html等内容生成。我还没有参加这一部分。目标也是不复制test.html的内容,因为该文件将在我的桌面应用程序中使用(使用Web控件)。在我的桌面应用程序中,我不需要菜单等。

更新#2:我必须将<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>添加到我想要阅读的html文件中,现在我确实获得了正文内容。不幸的是,所有标签都是条带。我也需要解决这个问题。

1 个答案:

答案 0 :(得分:2)

问题是saveHTML()将返回实际文档。你不想要这个。相反,你只想要放入的东西。

谢天谢地,你可以更轻松地做到这一点。

function getBodyContent(DOMNode $element) {
    $doc = $element->ownerDocument;
    $wrapper = $doc->createElement('div');
    foreach( $element->childNodes as $child) {
        $wrapper->appendChild($child);
    }
    $element->appendChild($wrapper);
    $html = $doc->saveHTML($wrapper);
    return substr($html, strlen("<div>"), -strlen("</div>"));
}

这会将内容包装到已知标记表示的单个元素中(正文可能具有使其未知的属性),从该元素获取呈现的HTML ,并剥离已知标记包装

我还想建议改进getSingleElementValue

function getSingleElementValue(DOMNode $element) {
    return trim($element->textContent);
}

还要注意使用类型提示来确保你的函数确实得到了预期的东西 - 这很有用,因为它意味着我们不再需要检查&#34; $element->ownerDocument是否存在? $element->ownerDocument->saveHTML()做我们认为它做的事情吗?&#34;和其他这样的问题。它确保我们有DOMNode,因此我们知道它有这些东西。