2016-07-08 91 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