1

我试图删除所有 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;
}

我的代码删除了所有出现。有什么想法可以保留最后吗?

4

5 回答 5

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);
}
于 2013-10-30T13:49:28.340 回答
2

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

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

尽管为此使用正则表达式并不是最好的主意。您确实应该考虑在 php 中使用 DOM 对象来执行此操作。

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

于 2013-10-30T13:49:43.190 回答
1

您可以在正则表达式中设置另一个 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 />"
于 2013-10-30T13:50:31.200 回答
0

您的正则表达式替换所有 iframe 的原因是它匹配所有 iframe。尝试使用preg_matchorpreg_match_all找出会找到什么(反过来,这就是将被替换的列表)

如果你真的想通过正则表达式来做到这一点(这通常被认为是“一件坏事”),那么id为每个结构添加一个标签<iframe...></iframe>,然后将它添加到正则表达式中,看看它会带给你什么。

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

于 2013-10-30T13:49:34.283 回答
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>
于 2013-10-30T13:58:22.830 回答