问题已更新,可将正则表达式排除在可能的解决方案之外。
我正在尝试构建一个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>"
感谢您的帮助!
答案 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将匹配所有子图像......你必须做一些额外的处理,以确保你真正做你认为你正在做的事情。但是,它比盲目替换更安全。