Preg_replace删除除最后一个之外的所有iframe

时间:2013-10-30 13:42:16

标签: php regex preg-replace

我试图删除所有iframe但保留最后一个iframe。

这是我加载的html

<br />CAP 01:<br /><iframe src="mysitevideo.com/embed-291dz33facsl-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 02: <br /><iframe src="http://mysitevideo.com/embed-3bp1mdixoiyc-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 03: <br /><iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />

输出应为:<iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe>

这是我的功能

function DELiframeEXCEPTlast($str){
$str = preg_replace('#<iframe src="(.*?)" width="540" height="320" frameborder="0" scrolling="no"></iframe>#','',$str);
return $str;
}

我的代码会删除所有发生的事件。任何保持最后的想法?

5 个答案:

答案 0 :(得分:2)

也许是这样的?

function DELiframeEXCEPTlast($str){
  $pattern='#<iframe src="(.*?)" width="540" height="320" frameborder="0" scrolling="no"></iframe>#';
  return preg_replace($pattern,'',$str,preg_match_all($pattern,$str)-1);
}

答案 1 :(得分:2)

使用preg_split并返回返回数组中的最后一项。

http://www.php.net/manual/en/function.preg-split.php

虽然使用正则表达式并不是最好的主意。你真的应该看看在php中使用DOM对象来做这件事。

http://www.php.net/manual/en/book.dom.php

答案 2 :(得分:1)

您可以在regexp中设置另一个iframe,如下所示:

function DELiframeEXCEPTlast($str){
$str = preg_replace('#(<iframe[^>]*></iframe>)*.*(<iframe[^>]*></iframe>)#','$2',$str);
return $str;
}
var_dump(DELiframeEXCEPTlast('<br />CAP 01:<br /><iframe src="mysitevideo.com/embed-291dz33facsl-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 02: <br /><iframe src="http://mysitevideo.com/embed-3bp1mdixoiyc-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 03: <br /><iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />'));

将输出

string(104) "<iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />"

答案 3 :(得分:0)

您的正则表达式替换所有iframe的原因是因为它匹配所有iframe。尝试使用preg_matchpreg_match_all找出可以找到的内容(反过来,这将是要替换的内容列表)

如果你真的想通过正则表达式(通常被认为是“一件坏事”)这样做,那么在每个id结构中添加<iframe...></iframe>标签,然后将其添加到正则表达式中,并查看它将从何处获取。

这里有很多答案,建议在PHP中使用DOM函数来改变HTML代码而不是正则表达式。我没有亲自使用它们(从来没有通过PHP调整HTML),但这可能是一条更好的路线。

答案 4 :(得分:0)

由于您正在解析和修改HTML,我强烈推荐DOM Parser。请考虑以下代码:

$html = '<br />CAP 01:<br /><iframe src="mysitevideo.com/embed-291dz33facsl-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 02: <br /><iframe src="http://mysitevideo.com/embed-3bp1mdixoiyc-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />CAP 03: <br /><iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br />';

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//iframe");

$numnodes = $nlist->length;
// run loop till $numnodes-1
for($i=0; $i < $numnodes-1; $i++) {
   $node = $nlist->item($i);
   // delete it
   $node->parentNode->removeChild($node);
}

$newHTML =  $doc->saveHTML();
echo $newHTML;

输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><br>CAP 01:<br><br>CAP 02: <br><br>CAP 03: <br>
<iframe src="http://mysitevideo.com/embed-0d213t7vp8f2-540x320.html" width="540" height="320" frameborder="0" scrolling="no"></iframe><br></body></html>