如何使用HTML DOM解析器PHP获取特定HTML标签开始前的文本

4

我无法弄清如何获取html标签之间的文本,在我的情况下,所需文本未被标签包含,除了段落标签<p>

<div class="entry clearfix">
<p>111</p>
<p><img class="alignnone size-medium wp-image-38376" src="1.jpg" alt="Talvar" /></p>
<p><strong>111: </strong>111<br/>
    <strong>111:</strong> 111<br/>
    <strong>111:</strong> 111 111<br/>
    <strong>111: </strong>111<br/>
    <strong>111: </strong>1111
</p>
<p><strong>111</strong></p>
<p>
    <strong>01 &#8211;</strong> data1 <strong><a href="#">Download</a><br/>
    </strong><em>222</em><br/>
    <strong>02 &#8211;</strong> data2 <strong><a href="#">Download</a><br/>
    </strong><em>222</em><br/>
    <strong>03 &#8211;</strong> data3 <strong><a href="#">Download</a><br/>
    </strong><em>222</em><br/>
    <strong>04 &#8211;</strong> data4 <strong><a href="#">Download</a><br/>
    </strong><em>222</em>
</p>
<p><strong>222</strong></p>
<p><strong><a href="" target="_blank">3333</a></strong></p>
<p><strong>eb</strong></p></div>

我需要data1、data2、data3、data4这些数据。为此,我正在寻找数组中编号为4的第5个元素<p>

    foreach($html->find('div[class="entry"]') as $row){
        $a = $row->find('p',4);
        echo $dt = $a->find('text',1)->plaintext; // returns me only data1
    }

如果我通过striptags()获取data1、data2、data3和data4,它们不在任何标签之间,除了<p>标签。它会返回所有文本以及111、Download、222等内容。请指导我如何获取数据系列。

1个回答

1

不确定是否有更优雅的方法,但这种方法也应该有效:

foreach($html->find('div[class="entry"]') as $row){
$a = $row->find('p',4);

$str=$a->find('strong');
$em=$a->find('em');

foreach($str as $tag) {

$a=str_replace($tag,'',$a);
$a=str_replace($em,'',$a);


        }

}

echo strip_tags($a,'<br>'); // if you want to keep br tags

所以,想法是 - 使用str_replace删除目标p中的strongem标签(以及文本内容,包括链接),并获取其余部分。如果您的HTML结构与您发布的结构相同,则应该可以正常工作。

感谢您的回答,我已经实现了您的方法,但是情况与我之前提到的 strip_tags() 相同。在执行 str_replace 后,其余结构仍然存在问题。<p> 中有未处理的 data 序列,无法分配给数组。尽管在替换后,我将组合数据拆分并转换为数组,但我相信还有更好的方法解决这个问题。再次感谢您。 - RanaHaroon
是的,您可以轻松获取数组:$str=strip_tags($a,'<br>'); print_r(explode('<br/>',$str));不过,如果您发现更好的方法,请告诉我们。 :) - sinisake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接