2016-04-28 157 views
1

我的功能需要從HTML代碼的一部分獲得所有第一級HTML標籤,以便我可以使用每個HTML代碼。PHP&Xpath:獲取所有第一級HTML標籤(所有兄弟)

這是我的HTML文檔總結如下:

<p>The breed was first...</p> 
<p>Semencic credits his...</p> 

<h1>Appearance</h1> 
<p>The breed's distinctive...</p> 
<p>It should be symmetrical...</p> 

<figure id="attachment_6" style="width: 840px" class="wp-caption alignnone"> 
    <img class="size-large wp-image-6" src="...jpg" alt="boerboel appearance" width="840" height="746"> 
    <figcaption class="wp-caption-text">The dog appearance.</figcaption> 
</figure> 

<h1>Requirements</h1> 
<p>Prospective owners....</p> 
<p>These dogs....</p> 

<h2>A Little Warning!</h2> 
<p>If you are considering...</p> 
<blockquote> 
    <p>According to...</p> 
    <p>Source: http://...</p> 
</blockquote> 
<p>Although more suitable...</p> 

現在,我想我的輸出是:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

但現在,它是:

h1 
p 
h1 
p 
h2 
p 
blockquote 
p 

有有幾件事是錯誤的: - '圖'沒有顯示 - 標準桿阿格拉夫標籤單挑,即使有幾個兄弟姐妹 - 第一p的都沒有發現

$doc = new DOMDocument(); 
$doc->loadHTML($this->post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXpath($doc); 
$nodes = $xpath->query("/*/*"); 

foreach ($nodes as $node) { 

    echo $node->nodeName; 
    echo '<br>'; 

    $this->add_part(
     md5($node->textContent), 
     $node->nodeName 
    ); 
} 
+1

我認爲你必須發佈真實的HTML代碼。您的代碼適用於我,使用由標籤包裝的HTML樣本。 – fusion3k

+0

我的html代碼是真正的html代碼,沒有標籤包裝所有這一切。 – Lazhar

回答

0

DOM(libxml的)將重新格式化輸入,所以它具有單個文檔元素。如果刪除解析器選項(LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD),它將修復該html並添加htmlbody元素。所以,如果你想裏面body元素節點可以使用表達//body/*

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('//body/*') as $node) { 
    var_dump($node->nodeName); 
} 

輸出:

string(1) "p" 
string(1) "p" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(6) "figure" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(2) "h2" 
string(1) "p" 
string(10) "blockquote" 
string(1) "p" 
0

對於記錄:您精確的HTML示例中,我得到這樣的結果:

p/h1/p/p/figure/h1/p/p/h2/p/blockquote/p 

代替這個(根據你的問題):

h1/p/   h1/p/ h2/p/blockquote/p 

3v4l.org demo

所以,我不知道這個答案是否能解決你的問題在真正的代碼。


HTML有一些規則。您嘗試處理沒有根元素的代碼。總結的東西你的代碼像<body>

$doc->loadHTML("<body>$txt</body>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

通過這種方式,我得到你想要的結果:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

3v4l.org demo

+0

如果這個解決方案不起作用,您可以打印' - > post_content'並向我們展示結果(從頁面源中複製它,而不是從渲染的頁面或檢查器複製)? – fusion3k

相關問題