我需要将两个图片之间的任意多个<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中的原始资料。
答案 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个可能的比赛:
但是,因为第二个是重叠,所以找到的唯一匹配是: