簡體   English   中英

PHP的DOMXPath正在剝離匹配文本中的標簽

[英]PHP's DOMXPath is stripping out my tags inside the matched text

我昨天問了這個問題,當時它正是我所需要的,但在處理一些實時數據時,我發現這並不是我所期望的那樣。 使用PHP的HTML DOMDocument解析HTML

它從HTML頁面獲取數據,但隨后它也會刪除捕獲的文本塊中的所有HTML標記,這不是我想要的。 (我可能不想拿出一些標簽,但不是全部,這可以在以后完成)

這是DOM的常見問題:如果您想獲取標簽的內容及其所有子項的內容,則必須做更多的工作。

基本上,您必須遍歷與XPath查詢匹配的子節點,以獲取其內容。

用戶在DOMElement的手冊頁上注明了一個解決方案 - 請參閱本說明


將此解決方案集成到您已有的代碼中應該為HTML字符串的聲明提供類似於此的內容,並使用子標記:

$html = <<<HTML
<div class="main">
    <div class="text">
        <p>
            Capture this <strong>text</strong> <em>1</em>
        </p>
        <p>
            And some other <strong>text</strong>
        </p>
    </div>
</div>
HTML;


並且,要從該HTML字符串中提取數據,您可以使用以下內容:

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    $innerHTML = '';

    // see http://fr.php.net/manual/en/class.domelement.php#86803
    $children = $tag->childNodes;
    foreach ($children as $child) {
        $tmp_doc = new DOMDocument();
        $tmp_doc->appendChild($tmp_doc->importNode($child,true));       
        $innerHTML .= $tmp_doc->saveHTML();
    }

    var_dump(trim($innerHTML));
}

唯一改變的是foreach循環的內容:您不必僅使用$tag->nodeValue ,而是必須迭代子元素。


這給了我以下輸出:

string '<p>
            Capture this <strong>text</strong> <em>1</em>
        </p>


<p>
            And some other <strong>text</strong>
        </p>' (length=150)

這是匹配的<div>標記的全部內容及其所有子標記 - 包括標記。


注意:手冊的用戶注釋中經常有有趣的想法和解決方案;-)

Pascal MARTIN的答案很棒,但我發現它可以簡化

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    $innerHTML = '';

    $children = $tag->childNodes;
    foreach ($children as $child) {     
        $innerHTML .= $dom->saveHTML($child);
    }

    var_dump(trim($innerHTML));
}

這種方式似乎產生相同的結果,但不需要在foreach循環內創建新的DomDocument對象。

編輯:

因此,經過進一步的實驗,您實際上可以將上述內容減少到:

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($dom->saveHTML($tag)));
}

暫無
暫無

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

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