4

我需要将两个图像之间的标签减少到一个<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>

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

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

谢谢你的帮助!

编辑 仅供参考,我无法控制 $content 中的原始源材料。

4

2 回答 2

2

这应该有效:

preg_replace('/(<img[^>]*>\s*)(<br\s*\/?>(\s*))*(?=<img)/si', '\\1<br/>\\3', $content);
于 2012-11-19T15:22:50.933 回答
1

img问题是第一个匹配项(由前两个标签组成)和下一个潜在匹配项(最后两个)之间存在重叠。尝试改用这个正则表达式:

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

在这里看到它:http ://rubular.com/r/89UGSRaWOX

为了更清楚地理解问题,请考虑将字符串aaaa与 regex匹配的类似情况aa。这里有 3 个可能的匹配项:

  1. 啊啊
  2. 啊啊啊_
  3. 啊啊

但是,因为第二个是重叠的,所以找到的唯一匹配项是:

  1. 啊啊
  2. 啊啊

在这里看到它:http ://rubular.com/r/DwfGodT08R

于 2012-11-19T15:28:00.203 回答