如何在dom中的特定类之后获取所有p标记

时间:2014-12-02 06:21:27

标签: php html simple-html-dom

我有一个HTML:

<p class="story-body__introduction">2013 yazındaki Gezi Parkı eylemlerinin başlarından itibaren çeşitli medya kurumları, gösterilerin arkasında Sırp gençlik örgütü Otpor'un olduğunu iddia etti.</p>
<p>Geçtiğimiz günlerde ise, "Emniyet Genel Müdürlüğü Kaçakçılık ve Organize Suçlarla Mücadele Daire Başkanlığı'nın Gezi Parkı eylemlerinin devam ettiği 15 Haziran 2013'te İstanbul Organize Suçlarla Şube Müdürlüğü'ne gönderdiği yazıda eylemlerle ilgili Otpor'u işaret ettiği" bildirildi.</p>
<p>Radikal.com.tr'de yer alan habere göre, "Bu yazı üzerine dönemin İstanbul Organize Suçlarla Şube Müdürü Nazmi Ardıç, İstanbul Cumhuriyet Başsavcılığı'na yazdığı yazıda ve Savcı Muammer Akkaş da İstanbul 1 No'lu Hakimliği'ne başvurarak çeşitli bilgiler istedi."</p>
<p>Yazıda "Türkiye'de Otpor / Canvas örgütü tarafından bir halk hareketi geliştirilmeye çalışıldığı ve Otpor lideri İvan Maroviç'in birçok kişiyi bu yönde eğittiği" bildiriliyor.</p>
<p>Maroviç'in bu kapsamda oyuncu Memet Ali Alabora'nın da aralarında bulunduğu isimlerle görüştüğü iddia ediliyor.</p>
<p>Otpor, Sırbistan'da 1998 - 2004 yılları arasında faaliyet gösteren, dönemin lideri Slobodan Miloseviç'in devrilmesine neden olan sokak hareketlerinin önemli bileşenlerinden bir gençlik hareketi.</p>

我的目标是:我想在第一个class= "story-body__introduction"

之后获取所有p标签

代码:

$storyBodyIntroduction = $html->find('p[class=story-body__introduction]', 0)->innertext();

我如何获得其他<p>

2 个答案:

答案 0 :(得分:3)

您可以使用XPath,它是DOM extension的一部分,随大多数PHP发行版一起提供。

$doc = new DOMDocument;
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$query = '//p[preceding-sibling::p[@class="story-body__introduction"]]';

foreach ($xpath->query($query) as $node) {
    echo $node->textContent, PHP_EOL;
}

它选择跟随所需类的兄弟的所有段落元素。请注意,如果元素具有多个类,则需要使用不同的查询。

答案 1 :(得分:2)

是的,很有可能,你可以在找到之后添加一个标志,以获得<p>所有剩余的内容:

$found = false;
$text = array();
foreach($html->find('p') as $p) {
    if($p->class == 'story-body__introduction') {
        $found = true;
        continue;
    }

    if($found) {
        $text[] = $p->innertext;
    }
}

echo '<pre>';
print_r($text);

旁注:->innertext属性/属性而不是函数 innertext()

补充信息:此答案实际上获取了文档中的所有段落元素。如果事实证明你只需要那些作为该段起点的兄弟姐妹的元素,你也可以检查他们的父母是否在同一级别。例如:

$found = false;
$text = array();

$start_point = $html->find('p.story-body__introduction', 0);
foreach($html->find('p') as $p) {
    if($p->class == 'story-body__introduction') {
        $found = true;
        continue;
    }

    if($found && ($p->parent() == $start_point->parent()) ) {
        $text[] = $p->innertext;
    }
}

echo '<pre>';
print_r($text);

这个答案只会从起点那里得到那些兄弟姐妹(在同一水平上)。