php提取body标签内容

php extract body tag content

我正在尝试应该非常简单的方法,但我无法让它工作。这让我想知道我是否使用了正确的工作流程。

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

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

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;

正确提取标题。

现在我尝试提取 body:

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() 函数是我尝试过的几个选项之一。 所有 return 整个 HTML 标签,包括 HEAD 标签。

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

谢谢。

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

更新 #2: 我必须将 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 添加到我想阅读的 html-file,现在我确实得到了 body内容。不幸的是,所有标签都是条带。我也需要修复它。

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

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

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);
}

另请注意类型提示的使用,以确保您的函数确实得到预期的结果 - 这很有用,因为它意味着我们不再需要检查 "does $element->ownerDocument exist? does $element->ownerDocument->saveHTML() do what we think it does?" 和其他此类问题。它确保我们有 DOMNode,所以我们 知道 它有那些东西。