我试图删除所有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;
}
我的代码会删除所有发生的事件。任何保持最后的想法?
答案 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对象来做这件事。
答案 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_match
或preg_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>