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


How to get all p tags after particular class in 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>

你可以为此使用 XPath,它是 DOM 扩展的一部分,随大多数 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;
}

它选择具有所需类的同级元素后面的所有段落元素。 请注意,如果元素具有多个类,则需要不同的查询。

是的,很有可能,您可以添加一个标志,在找到标志后,获取<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);

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