【发布时间】:2014-06-30 01:50:48
【问题描述】:
我想通过 simple_html_dom 提取 html 字符串的所有 p 元素。应该得到p元素的顺序。
<section class="box_1">
<header class="trigger"><h2>Title</h2></header>
<div class="content">
<div class="box_2">
<div class="class"></div>
<div class="content">
<p>Text Level 2</p>
<p>More Text Level 2</p>
</div>
</div>
<div class="box_2">
<div class="class"></div>
<div class="content">
<p>Text Level 2</p>
<div class="box_3">
<div class="content">
<p>Text Level 3</p>
</div>
</div>
</div>
</div>
</div>
</section>
但是同一个内容容器中的所有 p 元素都应该合并在一起。
我试过这个:
foreach($html->find('p') as $element) {
if ($element->parent()->parent()) {
$class= $element->parent()->parent()->getAttribute('class');
if ($class=="box_3") $level = 3;
else if ($class=="box_2") $level = 2;
else if ($class=="box_1") $level = 1;
}
else { $level = 0; }
$array_content_element = array("level" => $level, "inhalt" => $element->plaintext);
array_push($array_content, $array_content_element);
}
但是有了这个,即“Text Level 2”和“More Text Level 2”将作为两个元素处理。但它们应该合并到“Text Level 2\nMore Text Level 2”中,这应该作为一个元素来处理。
所以在这个例子中,结果应该是一个包含三个元素(而不是四个)的数组。
更新:我忘记了一些事情。在节元素之外可以有 p 元素。请看下面的“Lorem ipsum”。
<p>Lorem ipsum</p>
<p>Lorem ipsum</p>
<section class="box_1">
<header class="trigger"><h2>Title</h2></header>
<div class="content">
<div class="box_2">
<div class="class"></div>
<div class="content">
<p>Text Level 2</p>
<p>More Text Level 2</p>
</div>
</div>
<div class="box_2">
<div class="class"></div>
<div class="content">
<p>Text Level 2</p>
<div class="box_3">
<div class="content">
<p>Text Level 3</p>
</div>
</div>
</div>
</div>
</div>
</section>
<p>Lorem ipsum</p>
<p>Lorem ipsum</p>
<section class="box_1">
<header class="trigger"><h2>Title</h2></header>
<div class="content">
<p>Text Level 1</p>
</div>
</section>
<p>Lorem ipsum</p>
<p>Lorem ipsum</p>
这些 p 元素应该像其他元素一样对待(总结一个块的 p 元素)。在这种情况下,级别 = 0。
【问题讨论】:
标签: php simple-html-dom