我正在尝试应该很容易的事情,但我无法让它发挥作用。这让我想知道我是否使用了正确的工作流程。
我有一个简单的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文件中,现在我确实获得了正文内容。不幸的是,所有标签都是条带。我也需要解决这个问题。
答案 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
,因此我们知道它有这些东西。