PHP使用DOMXPath剥离标记并删除节点

PHP使用DOMXPath剥离标记并删除节点,php,html,xpath,domdocument,Php,Html,Xpath,Domdocument,我试图使用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 con

我试图使用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>
因此,我的代码可以删除整个span节点,但如何获取节点并去掉它的标记,但保留其内容

另外,如何删除并清空span?我确信我可以使用regex或replace来实现这一点,但我有点想使用dom来实现这一点


谢谢

不,我不推荐使用正则表达式,我强烈建议您使用这个漂亮的HTML解析器,在现有的基础上进行构建。在这种情况下,您可以使用
->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>

我无法编辑您的帖子,因为建议编辑评论已满,但您的代码中有一个错误,变量$span应该是$t
<html>
    <head></head>
    <body></body>
</html>