Php 使用DomDocument将所有标题标记替换为h4标记
我已经使用DomDocument来获取ElementById。它选择了一个div。我需要用h4标记替换该div中的所有标题标记。您在问题中没有明确说明您遇到的具体问题。我假设有两个部分会让你产生一些疑问 第一个问题是如何掌握所有要重命名的元素,第二个问题实际上是如何重命名元素 获取文档的标题元素 所以首先要做的事情是:要选择所有标题元素,您需要选择所有标记。再加上它们还需要是具有特定id属性的div标记的子项,这似乎是一件相当复杂的事情。然而,对于xpath查询,它仍然仅仅是简单的 对于我的代码示例,我选择了id`content,下面的xpath表达式查询所有标题元素:Php 使用DomDocument将所有标题标记替换为h4标记,php,dom,replace,tags,document,Php,Dom,Replace,Tags,Document,我已经使用DomDocument来获取ElementById。它选择了一个div。我需要用h4标记替换该div中的所有标题标记。您在问题中没有明确说明您遇到的具体问题。我假设有两个部分会让你产生一些疑问 第一个问题是如何掌握所有要重命名的元素,第二个问题实际上是如何重命名元素 获取文档的标题元素 所以首先要做的事情是:要选择所有标题元素,您需要选择所有标记。再加上它们还需要是具有特定id属性的div标记的子项,这似乎是一件相当复杂的事情。然而,对于xpath查询,它仍然仅仅是简单的 对于我的代码
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)
如果我在回答之前在此网站上运行此操作,它将创建以下标记列表:
Found 8 elements:
#00: <h1>
#01: <h2>
#02: <h2>
#03: <h3>
#04: <h3>
#05: <h3>
#06: <h2>
#07: <h4>
将其与上面的foreach循环结合在一起,在输出标记名的旁边,它们也可以重命名:
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
dom_rename_element($element, 'h4');
###################################
}
然后,再次查询xpath表达式将只生成h4标记:
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
输出:
Found 8 elements:
#00: <h1>
#01: <h2>
#02: <h2>
#03: <h3>
#04: <h3>
#05: <h3>
#06: <h2>
#07: <h4>
完整代码示例
下面是完整的代码示例及其输出一览:
$url = 'http://stackoverflow.com/questions/16307103/use-domdocument-to-replace-all-header-tags-with-the-h4-tags';
$dom = new DOMDocument();
$internalErrorsState = libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_use_internal_errors($internalErrorsState);
$xpath = new DOMXPath($dom);
$expression = '
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)';
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
<?php
/**
* Use DomDocument to replace all header tags with the h4 tags
* @link http://stackoverflow.com/q/16307103/367456
*/
$url = 'http://stackoverflow.com/questions/16307103/use-domdocument-to-replace-all-header-tags-with-the-h4-tags';
$dom = new DOMDocument();
$internalErrorsState = libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_use_internal_errors($internalErrorsState);
$xpath = new DOMXPath($dom);
$expression = '
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)';
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
dom_rename_element($element, 'h4');
}
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
/**
* Renames a node in a DOM Document.
*
* @param DOMElement $node
* @param string $name
*
* @return DOMNode
*/
function dom_rename_element(DOMElement $node, $name) {
$renamed = $node->ownerDocument->createElement($name);
foreach ($node->attributes as $attribute) {
$renamed->setAttribute($attribute->nodeName, $attribute->nodeValue);
}
while ($node->firstChild) {
$renamed->appendChild($node->firstChild);
}
return $node->parentNode->replaceChild($renamed, $node);
}
如果您尝试一下,您可能会注意到,在我给出答案之后,标题元素的数量已经发生了变化。我希望这是有帮助的 你的问题中没有明确说明你遇到的具体问题是什么。我假设有两个部分会让你产生一些疑问 第一个问题是如何掌握所有要重命名的元素,第二个问题实际上是如何重命名元素 获取文档的标题元素 所以首先要做的事情是:要选择所有标题元素,您需要选择所有标记。再加上它们还需要是具有特定id属性的div标记的子项,这似乎是一件相当复杂的事情。然而,对于xpath查询,它仍然仅仅是简单的 对于我的代码示例,我选择了id`content,下面的xpath表达式查询所有标题元素:
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)
如果我在回答之前在此网站上运行此操作,它将创建以下标记列表:
Found 8 elements:
#00: <h1>
#01: <h2>
#02: <h2>
#03: <h3>
#04: <h3>
#05: <h3>
#06: <h2>
#07: <h4>
将其与上面的foreach循环结合在一起,在输出标记名的旁边,它们也可以重命名:
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
dom_rename_element($element, 'h4');
###################################
}
然后,再次查询xpath表达式将只生成h4标记:
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
输出:
Found 8 elements:
#00: <h1>
#01: <h2>
#02: <h2>
#03: <h3>
#04: <h3>
#05: <h3>
#06: <h2>
#07: <h4>
完整代码示例
下面是完整的代码示例及其输出一览:
$url = 'http://stackoverflow.com/questions/16307103/use-domdocument-to-replace-all-header-tags-with-the-h4-tags';
$dom = new DOMDocument();
$internalErrorsState = libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_use_internal_errors($internalErrorsState);
$xpath = new DOMXPath($dom);
$expression = '
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)';
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
<?php
/**
* Use DomDocument to replace all header tags with the h4 tags
* @link http://stackoverflow.com/q/16307103/367456
*/
$url = 'http://stackoverflow.com/questions/16307103/use-domdocument-to-replace-all-header-tags-with-the-h4-tags';
$dom = new DOMDocument();
$internalErrorsState = libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_use_internal_errors($internalErrorsState);
$xpath = new DOMXPath($dom);
$expression = '
(
//div[@id="content"]//h1
|//div[@id="content"]//h2
|//div[@id="content"]//h3
|//div[@id="content"]//h4
|//div[@id="content"]//h5
|//div[@id="content"]//h6
)';
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
dom_rename_element($element, 'h4');
}
$elements = $xpath->query($expression);
echo "Found ", $elements->length, " elements:\n";
foreach ($elements as $index => $element) {
printf(" #%02d: <%s>\n", $index, $element->tagName);
}
/**
* Renames a node in a DOM Document.
*
* @param DOMElement $node
* @param string $name
*
* @return DOMNode
*/
function dom_rename_element(DOMElement $node, $name) {
$renamed = $node->ownerDocument->createElement($name);
foreach ($node->attributes as $attribute) {
$renamed->setAttribute($attribute->nodeName, $attribute->nodeValue);
}
while ($node->firstChild) {
$renamed->appendChild($node->firstChild);
}
return $node->parentNode->replaceChild($renamed, $node);
}
如果您尝试一下,您可能会注意到,在我给出答案之后,标题元素的数量已经发生了变化。我希望这是有帮助的 发布xml或html内容发布xml或html内容