2016-07-08 15 views
0

Ich habe eine Zeichenfolge wie folgt:PHP - Wrap mehrere Instanzen mit preg_replace

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

Ich möchte zu kommen:

'<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>' 

Also im Grunde würde ich einen preg_replace bewerben um alle 2 Elemente in einem DIV zu verpacken.

suchte ich das Forum und fand einige Tipps, die ich versucht:

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

und

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

Aber es ist nicht ...

Jede Idee, Jungs funktioniert?

Vielen Dank!

+0

Versuchen Sie wie [diese Demo] (https://eval.in/602357). –

Antwort

2

Verwenden DomDocumen Objekt, es zu tun:

$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

Hier arbeitet Beispiel:

<?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; 

Es ist Ihr zweites Beispiel, aber mit 4 fixen:

  1. class ->src
  2. hinzugefügt block(), um 2 Artikel zu fangen s
  3. feste Menge {2,} -> {2,2} (es ändern {1,2}, wenn Sie das letzte Mal ein img Tag fangen wollen)
  4. \s* hinzugefügt zu fangen Leerzeichen und Zeilenumbrüche zwischen img-Tags
+0

Vielen Dank, es funktioniert! Aber wie es nur alle 2 Elemente funktioniert, ist das 5. Bild nicht in einem Div verpackt. Ich würde lieber mag es kommen: '

' Also ich frage mich, ob preg_replace eine gute Lösung ... – user3240470

+0

wenn Sie {2,2} ändern werde {1, 2} dann sollte es wie erwartet funktionieren. – oakymax