1

问题已更新以排除正则表达式作为可能的解决方案。

我正在尝试构建一个 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>"

谢谢你的帮助!

4

3 回答 3

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>");

到目前为止,这似乎工作得很好,尽管我只在几个不同的内容上尝试过。我不擅长这个,所以如果有人有建议,请自由分享......

感谢您的所有回答!

于 2010-11-30T23:55:00.933 回答
0

根据评论更新

您可以使用 css 选择器来抓取您正在寻找的 div,然后爬上树以获取您选择的最外层元素。

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

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

这适用于 Javascript,但我不了解 php。

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

于 2010-11-30T23:05:08.713 回答
0

Jeff Atwood 有一篇非常棒的博客文章反对使用正则表达式解析 HTML。http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html

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

于 2010-11-30T22:34:10.907 回答