2014-12-02 82 views
2

有一個html:我如何獲得特定類畢竟p標籤在DOM

<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>

+0

是的,很有可能,你也應該發佈你的代碼/嘗試 – Ghost 2014-12-02 06:23:10

+0

你將需要JavaScript,而不是PHP。 – 2014-12-02 06:23:12

+0

但是這是可能的與dom。 – Nikul 2014-12-02 06:23:54

回答

2

是的,它很可能,你可以添加一個標誌,它的發現之後,得到的<p> innertexts所有的休息:

$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); 

這個答案只會從起點得到那些兄弟姐妹(同一級別)。

+1

我仍然想知道他們爲什麼叫它*簡單* html dom ;-) – 2014-12-02 07:00:20

+0

@Ja͢ck是的_simple_是相當關閉。一個xpath查詢就像你的答案應該足夠了 – Ghost 2014-12-02 07:07:36

2

您可以爲此使用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; 
} 

它選擇所有級別後面的所有段落元素。請注意,如果元素具有多個類,則需要使用其他查詢。