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

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 に答える
0

正規表現がすべての iframe を置き換える理由は、すべての iframe に一致するためです。preg_matchorpreg_match_allを使用して、何が見つかるかを調べてみてください(これは、置き換えられるもののリストです)

本当にこれを正規表現で行いたい場合 (これは一般的に「悪いこと」と見なされます)、id各構造にタグを<iframe...></iframe>追加し、それを正規表現に追加して、どこに到達するかを確認します。

ここには、PHP の DOM 関数を使用して、正規表現ではなく HTML コードを変更することを推奨する回答がたくさんあります。私は個人的にそれらを使用したことはありません (以前は PHP を介して HTML を調整する必要はありませんでした) が、それはおそらくより良い方法です。

于 2013-10-30T13:49:34.283 に答える