从指定标记外的字符串中删除所有内容(PHP)

时间:2010-11-30 22:29:57

标签: php dom tags strip

问题已更新,可将正则表达式排除在可能的解决方案之外。

我正在尝试构建一个php函数,它允许我删除指定标记之外的所有内容,同时保留指定的标记及其内容,并且不确定如何执行此操作...

例如:

$string = "lorem ipsum <div><p>Some video content</p><object></object></div><p>dolor sit</p> amet <img>"

some_function($string, "<div><img>");
returns: "<div><p>Some video content</p><object></object></div><img>"

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

好的,所以我想我找到了一种基于explode_tags函数修改版本的方法,我发布了上面的链接:

function explode_tags($chr, $str) { 
    for ($i=0, $j=0; $i < strlen($str); $i++) { 
        if ($str{$i} == $chr) { 
            while ($str{$i+1} == $chr) $i++; 
            $j++; 
            continue; 
        } 
        if ($str{$i} == "<") { 
            if (strlen($res[$j]) > 0) $j++;
            $s = strpos($str, " ", $i);
            $b = strpos($str, ">", $i);
            if($s<$b) $end = $s; 
            else $end = $b;
            $t = substr($str, $i+1, $end-$i-1);
            $tend = strpos($str, ">", $i);
            $tclose = strpos($str, "</".$t, $tend);
            if($tclose!==false) $pos = strpos($str, ">", $tclose);
            else $pos = strpos($str, ">", $i);
            $res[$j] .= substr($str, $i, $pos - $i+1); 
            $i += ($pos - $i); 
            $j++; 
            continue; 
        } 
        if ((($str{$i} == "\n") || ($str{$i} == "\r")) && (strlen($res[$j]) == 0)) continue; 
        $res[$j] .= $str{$i}; 
    } 
    return $res; 
}
function filter_tags($content, $tags) {
    $content = strip_tags($content, $tags);
    $tags = substr($tags, 1, -1);
    $d = strpos($tags, "><");
    if($d===false) $tags = array($tags);
    else $tags = explode("><", $tags);
    $content = explode_tags("", $content);
    $result="";
    foreach($content as $c) {
        $s = strpos($c, " ");
        $b = strpos($c, ">");
        if($s<$b) $end = $s;
        else $end = $b;
        $tag = substr($c, 1, $end-1);
        if(in_array($tag, $tags)) $result.=$c;
    }
    return $result;
}

filter_tags($content, "<img><div><object><embed><iframe><param><script>");

到目前为止,这似乎完美无缺,尽管我只在几个不同的内容上尝试过。我对此并不擅长,所以如果有人有建议请自由分享......

感谢您的所有答案!

答案 1 :(得分:0)

杰夫阿特伍德有一篇非常棒的博文,主张反对使用正则表达式来解析HTML。 http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html

然而,在这种情况下,使用正则表达式首先删除极端结束然后使用DOM解析器从内部挑选出你想要的结构可能不是一个坏主意。

答案 2 :(得分:0)

根据评论进行更新

您可以使用css选择器来抓取您要查找的div,然后爬上树以获取所选内容的最外层元素。

请参阅zend.dom.query框架。 http://framework.zend.com/manual/en/zend.dom.query.html

基本上查询“div img”以立即在div标签内获取img标签。 然后爬上树,直到到达目标位置,然后提取并保存该节点的outerHTML ....

这可以在Javascript中使用,但我不知道php。

这里需要注意的是,你失去了上面例子的特殊性。即:一个包含四个图像的div将匹配所有子图像......你必须做一些额外的处理,以确保你真正做你认为你正在做的事情。但是,它比盲目替换更安全。