用PHP替换HTML文本中的字符串模式


replace string pattern in HTML text with PHP

我为我的客户编写了一个自定义的基于web的所见即所得HTML编辑器。它允许他们格式化基本的HTML文本并插入图像。当他们插入图像时,我用类似##image1##的模式插入它们。生成的HTML可以是这样的:

<p>some text and some more text</p>
<p>some text and some <b>bold text</b></p>
<div>##image1##</div>
<p>more text can follow here</p>
<div>##image2##</div>

当我浏览这个HTML时,我会在其中搜索,并用实际显示图像的HTML标记替换出现的图像和##image1####image2##等。我的替换代码在这里:

// first find all occurrences of image string
preg_match_all('|##(.+)##|', $inputHTML, $matches);
for every match in $inputHTML
    $output = preg_replace('|##(.+)##|', $imageHTML, $inputHTML, 1 );

这在大多数情况下都会起作用,但在某些输入变体中,HTML会解析奇怪的结果。产生奇怪结果的HTML之一是:

<div>##image1##</div><p class="align-justify"><strong>Peter Dekleva</strong>, <strong>Damir Lisica</strong>, <strong>Anej Kočevar</strong> in <strong>Gregor Jakac</strong> so glasbeniki, ki v svoji glasbi združujejo silovite  instrumentalne vložke, markantne melodije in močna besedila.</p><div>##image2##</div><p class="align-justify">Video dvojček skladbe Brez strahu torej prikazuje oblico sproščenih trenutkov iz zaodrja, veličasnih posnetkov s koncertnega dogajanja, priprav na nastope, nepredvidljive zaključke noči.</p>

如果我编辑HTML并在<div>##image2##</div>之前添加一个换行符,它就会解析它。你知道这里发生了什么吗?我为什么会有问题吗?

我也愿意接受关于更好的方法的建议。在我的所见即所得编辑器中插入图像时,我可以插入其他内容,而不是##image1##。。。感谢

这是因为+修饰符是贪婪的。因此,它将匹配所有内容,直到##的最后一个实例。尝试在+之后添加一个?,将其更改为unreedy。

|##(.+?)##|

换行修复问题的原因是默认情况下.与换行不匹配。然而,如果你改为|##(.+)##|s,断线就不会解决问题。

编辑我刚刚注意到churk对您上一个问题的回答也会正确。

您应该直接创建<img/>,但无论如何,如果您的图像名称不使用#,请使用^#而不是.

如果你不确定##不会在其他HTML中使用,也测试<div>

<div>##(^#+)##</div>