PHP 使用 DOMXPath 剥离标签和删除节点

标签 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 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 有一个类似 ice-del 的类保留内部内容但删除 span 标签。如果它有 ice-ins , 删除整个节点。

如果只是一个空span <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 解析器来构建您现在拥有的东西。在这种情况下,您可以使用 ->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();

关于PHP 使用 DOMXPath 剥离标签和删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26677257/

相关文章:

xml - Xslt- preceding-sibling within for-each

xslt - 如何创建模板以基于XSLT参数进行匹配

php - 检查cron作业是否已正确运行脚本-在批处理中记录错误的正确方法

php - 从搜索框获取值(value)

javascript - HTML 选择的 onClick 事件

javascript - 如何只重新加载一行

php - 为什么这个sql查询只返回两个结果?

php - 在 PHP 中运行 Windows Speech SDK 应用程序

html - Textarea css 不可点击

java - 无法找到输入文本元素,在 Selenium 2.47 中尝试了 id、class、name、xpath