2016-07-08 10 views
0

と、私はこのような文字列があります:私は来るしたいPHP - ラップ、複数のインスタンスにpreg_replace

'<img src="image1.jpg"><img src="image2.jpg"><img src="image3.jpg"> 
<img src="image4.jpg"><img src="image5.jpg">' 

'<div class="slide"><img src="image1.jpg"><img src="image2.jpg"></div>  
<div class="slide"><img src="image2.jpg"><img src="image3.jpg"></div> 
<div class="slide"><img src="image3.jpg"></div>' 

をだから、基本的に、私はにpreg_replaceを適用したいのですがDIVの2つの要素ごとに折り返します。

は、私は、フォーラムを検索し、私が試したいくつかのヒントが見つかりました:

$pattern = '/(<img[^>]*class=\"([^>]*?)\"[^>]*>)+/i'; 
$replacement = '<div class="slide">$1</div>'; 
$content = preg_replace($pattern, $replacement, $content); 

$pattern = '/(<img[^>]*class=\"([^>]*?)\"[^>]*>){2,}/i'; 
$replacement = '<div class="slide">$1</div>'; 
$content = preg_replace($pattern, $replacement, $content); 

しかし、それは動作しません...

任意のアイデア、人を?

ありがとうございました!それを行うには

+0

[このデモ](https://eval.in/602357)のようにしてください。 –

答えて

2

使用DomDocumenオブジェクト:

$str = '<img src="image1.jpg"><img src="image2.jpg"><img src="image3.jpg"> 
<img src="image4.jpg"><img src="image5.jpg">'; 
$dom = new DomDocument; 
$dom->loadHTML($str); 
$imgs = $dom->getElementsByTagName('img'); 

$i = $imgs->length; 
$cur = 0; 
$res = new DomDocument; 

while ($i >= 2) { 
    $div = $res->createElement('div'); 
    $div->setAttribute("class","slide"); 
    $res->appendChild($div); 
    $div->appendChild($res->importNode($imgs->item($cur++))); 
    $div->appendChild($res->importNode($imgs->item($cur++))); 
    $i -= 2; 
} 
if($i) $res->appendChild($res->importNode($imgs->item($cur++))); 

echo $res->saveHTML(); 

// <div class="slide"><img src="image1.jpg"><img src="image2.jpg"></div><div class="slide"><img src="image3.jpg"><img src="image4.jpg"></div><img src="image5.jpg"> 
0

ここでは例を働いている:

<?php 

$content = '<img src="image1.jpg"><img src="image2.jpg"> 
<img src="image3.jpg"><img src="image4.jpg"> 
<img src="image5.jpg">'; 

$pattern = '/((<img[^>]*src=\"([^>]*?)\"[^>]*>\s*){2,2})/i'; 
$replacement = '<div class="slide">$1</div>'; 
$content = preg_replace($pattern, $replacement, $content); 

echo $content; 

それはあなたの第2の例であるが、4回の修正で:

  1. class - >src
  2. block()を追加して2個のアイテムをキャッチするS
  3. 一定量{2} - > {2,2}(あなたが最後のimgタグをキャッチする場合は{1,2}に変更)
  4. \s*スペースをキャッチするために添加し、そしてラインは、IMGタグの間に破断します
+0

ありがとう、それは動作します! しかし、それは2つのアイテムごとにしか機能しないので、5番目のピクチャはdivにラップされません。 、あなたはに{2,2}、{1を変更しますならば...にpreg_replaceは良い解決策である場合

' '
は、だから私は思ったんだけど – user3240470

+0

を: は、私はむしろそれがに来るしたいのですが2}それは期待どおりに動作するはずです。 – oakymax