簡體   English   中英

PHP和Xpath:獲取所有一級HTML標簽(所有兄弟姐妹)

[英]PHP & Xpath: Get All The First Level HTML Tags (All Siblings)

我的函數需要從HTML代碼的一部分獲取所有第一級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
    );
}

對於記錄:使用精確的HTML示例,我獲得了以下結果:

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

而不是這個(根據你的問題):

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

3v4l.org演示

所以,我不知道這個答案是否會在實際代碼中解決您的問題。


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

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM