代码之家  ›  专栏  ›  技术社区  ›  ilija veselica

删除HTML标记及其内容

  •  15
  • ilija veselica  · 技术社区  · 15 年前

    我正在使用DOM解析字符串。我需要的功能是剥离跨标签及其内容。例如,如果我有:

    This is some text that contains photo.
    <span class='title'> photobyile</span>
    

    我想要函数返回

    This is some text that contains photo.
    

    这就是我所尝试的:

        $dom = new domDocument;
        $dom->loadHTML($string);
        $dom->preserveWhiteSpace = false;
        $spans = $dom->getElementsByTagName('span');
    
        foreach($spans as $span)
        {
            $naslov = $span->nodeValue; 
            echo $naslov;
    
            $string = preg_replace("/$naslov/", " ", $string);
        }
    

    我知道 $span->nodeValue 返回跨度标记的值,而不是整个标记的值,但我不知道如何获取整个标记以及类名。

    谢谢, 伊利

    2 回复  |  直到 11 年前
        1
  •  9
  •   hakre    11 年前

    尝试直接从DOM树中删除跨距。

    $dom = new DOMDocument();
    $dom->loadHTML($string);
    $dom->preserveWhiteSpace = false;
    
    $elements = $dom->getElementsByTagName('span');
    while($span = $elements->item(0)) {       
       $span->parentNode->removeChild($span);
    }
    
    echo $dom->saveHTML();
    
        2
  •  1
  •   kander    15 年前

    @文件-我遇到了这个问题-这是因为foreach迭代器的索引一直在快乐地递增,而在dom上调用removechild()似乎也会从domNodeList中删除节点($SPANS)。因此,对于您移除的每个跨度,nodelist收缩一个元素,然后将其foreach计数器增加一个。最终结果:跳过一个跨度。

    我确信有一种更优雅的方法,但这就是我所做的——我将引用从domNodeList移到了第二个数组,在该数组中,removechild()操作不会删除这些引用。

        foreach($spans as $span) {
            $nodes[] = $span;
        }
        foreach($nodes as $span) {
            $span->parentNode->removeChild($span);
        }