将两个img标记之间的中断数减少到一个

时间:2012-11-19 14:58:21

标签: php regex preg-replace

我需要将两个图片之间的任意多个<br><br/>标记减少为一个。它需要足够自由以在图像中遇到任何类型的属性信息,任何元素之间的任何类型的空白和两种形式的中断。请注意,我不希望影响<br/>代码之前或之后的<img>代码,只会影响两个代码之间的代码。

这就是我正在使用的:

$content = preg_replace('/(<img[^>]*>)+\s*?(<br\/?>\s*?)+\s*?(<img[^>]*>)+/is','$1<br/>$3',$content);

这是一个例子

    ...
    Some text here.<br>
    <br><img src="http://www.domain.tld/image1.jpg"><br>
    <img src="http://www.domain.tld/image2.jpg"><br><br/>
    <img src="http://www.domain.tld/image3.jpg">
</div>

该模式应仅替换image2和image3之间的2 x <br>标记。

我不知道为什么我的模式不起作用,你能看到我不是吗?

感谢您的帮助!

修改 仅供参考,我无法控制$ content中的原始资料。

2 个答案:

答案 0 :(得分:2)

这应该有效:

preg_replace('/(<img[^>]*>\s*)(<br\s*\/?>(\s*))*(?=<img)/si', '\\1<br/>\\3', $content);

答案 1 :(得分:1)

问题是第一个匹配(前两个img标记)和下一个潜在匹配(后两个)之间存在重叠。请尝试使用此正则表达式:

(<img[^>]*>)+\s*?(<br\/?>\s*?){2,}\s*?(<img[^>]*>)+

请在此处查看:http://rubular.com/r/89UGSRaWOX

要更清楚地理解问题,请考虑将字符串aaaa与正则表达式aa匹配的类似情况。这里有3个可能的比赛:

  1. aa aa
  2. a aa a
  3. aa aa
  4. 但是,因为第二个是重叠,所以找到的唯一匹配是:

    1. aa aa
    2. aa aa
    3. 请在此处查看:http://rubular.com/r/DwfGodT08R