我的 DOM 解析器 php 代码有什么问题?
What's wrong in my DOM parser php code?
HTML
$html='<h1>some text<h1>
sometext
<h2>some text</h2>
sometext
<h1>some text<h1>
sometext
<h2>some text</h2>
sometext
<h3>some text</h3>
sometext';
我需要用 div
包裹 h
个标签。父子关系就像 h1->h2->h3 等等。所以,我需要根据它
包装 div
$dom = new DOMDocument();
$dom->loadHTML($html);
$elements = $dom->getElementsByTagName('*');
for ($i = 0; $i < $elements->length; $i++) {
$element = $elements->item($i);
if ($element->tagName == 'h1'){
$wrap1 = $dom->createElement('div');
$wrap1->setAttribute('class', 'sect1');
$wrap1->appendChild($element);
$dom->appendChild($wrap1);
}
if ($element->tagName == 'h2'){
$wrap2 = $dom->createElement('div');
$wrap2->setAttribute('class', 'sect2');
$wrap2->appendChild($element);
$wrap1->appendChild($wrap2);
$dom->appendChild($wrap1);
}
}
echo $dom->saveHTML();
我的代码出了点问题,当我尝试执行它时,它一直在加载而不是传递输出,而且我不确定这段代码是否会得到我预期的输出,如下所示
<div class="sect1">
<h1>some text<h1>
sometext
<div class="sect2">
<h2>some text</h2>
sometext
</div>
</div>
<div class="sect1">
<h1>some text<h1>
sometext
<div class="sect2">
<h2>some text</h2>
sometext
<div class="sect3">
<h3>some text</h3>
sometext
</div>
</div>
</div>
问题出在这里:
for ($i = 0; $i < $elements->length; $i++) {
------------------^^^^^^^^^^^^^^^^^^
你每次都在添加新的项目,结果就是死循环。你可以这样解决:
for ($i = 0, $count = $elements->length; $i < $count; $i++) {
HTML
$html='<h1>some text<h1>
sometext
<h2>some text</h2>
sometext
<h1>some text<h1>
sometext
<h2>some text</h2>
sometext
<h3>some text</h3>
sometext';
我需要用 div
包裹 h
个标签。父子关系就像 h1->h2->h3 等等。所以,我需要根据它
$dom = new DOMDocument();
$dom->loadHTML($html);
$elements = $dom->getElementsByTagName('*');
for ($i = 0; $i < $elements->length; $i++) {
$element = $elements->item($i);
if ($element->tagName == 'h1'){
$wrap1 = $dom->createElement('div');
$wrap1->setAttribute('class', 'sect1');
$wrap1->appendChild($element);
$dom->appendChild($wrap1);
}
if ($element->tagName == 'h2'){
$wrap2 = $dom->createElement('div');
$wrap2->setAttribute('class', 'sect2');
$wrap2->appendChild($element);
$wrap1->appendChild($wrap2);
$dom->appendChild($wrap1);
}
}
echo $dom->saveHTML();
我的代码出了点问题,当我尝试执行它时,它一直在加载而不是传递输出,而且我不确定这段代码是否会得到我预期的输出,如下所示
<div class="sect1">
<h1>some text<h1>
sometext
<div class="sect2">
<h2>some text</h2>
sometext
</div>
</div>
<div class="sect1">
<h1>some text<h1>
sometext
<div class="sect2">
<h2>some text</h2>
sometext
<div class="sect3">
<h3>some text</h3>
sometext
</div>
</div>
</div>
问题出在这里:
for ($i = 0; $i < $elements->length; $i++) {
------------------^^^^^^^^^^^^^^^^^^
你每次都在添加新的项目,结果就是死循环。你可以这样解决:
for ($i = 0, $count = $elements->length; $i < $count; $i++) {