2016-07-08 63 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; 

這是你的第二個例子,但有4個修正:

  1. class - >src
  2. 添加塊()捕獲2個項目小號
  3. 固定數量{2} - > {2,2}(如果你想趕上最後一個img標籤將其更改爲{1,2})
  4. \s*加入到追趕的空間和IMG標記之間的換行符
+0

非常感謝,它的作品! 但是,因爲它只能每2個項目,第5張圖片不包裹在一個div。 我寧願喜歡它來: '

' 所以我想知道,如果是的preg_replace一個很好的解決方案... – user3240470

+0

如果你會改變{2,2} {1, 2}那麼它應該按照你的預期工作。 – oakymax