簡體   English   中英

PHP使用DOMXPath去除標記並刪除節點

[英]PHP Using DOMXPath to strip tags and remove nodes

我正在嘗試使用DOMDocument,但我遇到了一些問題。 我有一個像這樣的字符串:

Some Content to keep
<span class="ice-cts-1 ice-del" data-changedata="" data-cid="5" data-time="1414514760583" data-userid="1" data-username="Site Administrator" undefined="Site Administrator">
     This content should remain, but span around it should be stripped
</span> 
     Keep this content too
<span>
     <span class="ice-cts-1 ice-ins" data-changedata="" data-cid="2" data-time="1414512278297" data-userid="1" data-username="Site Administrator" undefined="Site Administrator">
         This whole node should be deleted
     </span>
</span>

我想要做的是,如果跨度有像ice-del這樣的類保留內部內容但刪除span標簽。 如果它有ice-ins ,則刪除整個節點。

如果它只是一個空的跨度<span></span>將其刪除。 這是我的代碼:

//this get the above mentioned string
$getVal = $array['body'][0][$a];
$dom = new DOMDocument;
$dom->loadHTML($getVal );
$xPath = new DOMXPath($dom);
$delNodes = $xPath->query('//span[@class="ice-cts-1 ice-del"]');
$insNodes = $xPath->query('//span[@class="ice-cts-1 ice-ins"]');

foreach($insNodes as $span){
    //reject these changes, so remove whole node
    $span->parentNode->removeChild($span);
}

foreach($delNodes as $span){
    //accept these changes, so just strip out the tags but keep the content
}

$newString = $dom->saveHTML();

因此,我的代碼可以刪除整個span節點,但是如何獲取節點並刪除它標記但保留其內容?

另外,我如何刪除並清空span? 我確信我可以使用正則表達式替換或替換,但我有點想使用dom這樣做。

謝謝

不,我不推薦正則表達式,我強烈建議使用這個漂亮的HTML Parser來構建你現在擁有的東西。 在這種情況下你可以使用->replaceChild

$dom = new DOMDocument;
$dom->loadHTML($getVal);
$xPath = new DOMXPath($dom);

$spans = $xPath->query('//span');
foreach ($spans as $span) {
    $class = $xPath->evaluate('string(./@class)', $span);
    if(strpos($class, 'ice-ins') !== false || $class == '') {
        $span->parentNode->removeChild($span);
    } elseif(strpos($class, 'ice-del') !== false) {
        $span->parentNode->replaceChild(new DOMText($span->nodeValue), $span);
    }
}

$newString = $dom->saveHTML();

從DOM樹中刪除任何HTML標記的更通用的解決方案使用此方法;

$dom = new DOMDocument;
$dom->loadHTML($getVal);
$xPath = new DOMXPath($dom);

$tagName = $xPath->query('//table'); //use what you want like div, span etc.
foreach ($tagName as $t) {
    $t->parentNode->removeChild($span);
}

$newString = $dom->saveHTML();

示例html:

<html>
    <head></head>
    <body>
       <table>
        <tr><td>Hello world</td></tr>
       </table>
    </body>
</html>

過程后輸出;

<html>
    <head></head>
    <body></body>
</html>

暫無
暫無

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

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