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
,所以我们 知道 它有那些东西。
我正在尝试应该非常简单的方法,但我无法让它工作。这让我想知道我是否使用了正确的工作流程。
我有一个简单的 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
,所以我们 知道 它有那些东西。