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

时间:2012-03-06 19:10:08

标签: php regex replace

对于我的客户,我编写了一个基于Web的自定义WYSIWYG 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>之前添加线制动器,那么它将解析它。知道这里发生了什么,为什么我有问题?

我也愿意接受更好的方法。在我的WYSIWYG编辑器中插入图像时,我可以插入其他内容而不是##image1## ...谢谢

2 个答案:

答案 0 :(得分:1)

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

|##(.+?)##|

换行符修复问题的原因是默认情况下.与换行符不匹配。但是,如果您已经改为:|##(.+)##|s换行符不能解决问题。

修改我刚注意到您之前提问的churk's answer也能正常运行。

答案 1 :(得分:0)

您应该直接创建<img/> - 但无论如何,如果您不使用#作为图片名称,请使用^#代替.

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

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