繁体   English   中英

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

[英]replace string pattern in HTML text with PHP

我为我的客户编写了一个基于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>之前添加行制动器,则它将解析为OK。 知道这里发生了什么,为什么会有问题吗?

我也欢迎提出建议,以寻求更好的方法。 在我的所见即所得编辑器中插入图像时,我可以插入其他内容,而不是##image1## ...谢谢

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

|##(.+?)##|

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

编辑我只是注意到churk对您先前问题的回答也可以正常工作。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM