【问题标题】:replace string pattern in HTML text with PHP用 PHP 替换 HTML 文本中的字符串模式
【发布时间】:2012-03-06 19:10:07
【问题描述】:

我为我的客户编写了一个基于 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 时,我正在搜索它并替换图像的出现,并将 ##image1####image2## 等替换为实际显示图像的 HTML 标记。我的替换代码在这里:

// 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 并在 &lt;div&gt;##image2##&lt;/div&gt; 之前添加一个换行符,那么它将解析它。知道这里发生了什么以及为什么我有问题吗?

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

【问题讨论】:

  • 为什么不直接插入图片 HTML?
  • 这不是和your other question一样的问题吗?
  • 因为洞应用程序的性质......很难解释,但这就是为什么不这样做的原因!
  • @DamienPirsy 在上一个问题中我询问了如何找到匹配项并且答案是正确的。从那以后,该解决方案不断发展,我决定问新的 Quesiton

标签: php regex replace


【解决方案1】:

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

|##(.+?)##|

换行符解决问题的原因是默认情况下. 不匹配换行符。但是,如果您这样做了:|##(.+)##|s 换行将无法解决问题。

编辑我刚刚注意到,churk's answer 您之前的问题也可以正常工作。

【讨论】:

  • 那个?在这种情况下确实解决了问题!非常感谢您。希望这将是这个问题的最终解决方案,虽然我看到这种解析也可能失败......有人将##放在 HTML 文本中的某个地方......
  • @Primoz 是的,这将是一个问题,但你总是可以这样做:/\{\{#([\s\S]+?)\}\}/ for {{#image1}}。有人不太可能在 html 中使用 {{#
【解决方案2】:

您应该直接创建&lt;img/&gt; - 但无论如何,如果您不使用# 作为图像名称,请使用^# 而不是.

如果你不确定## 不会在其他 HTML 中使用,也可以测试 &lt;div&gt;

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

【讨论】:

  • 在所见即所得编辑器中直接插入图像会带来各种各样的问题,从格式问题等等......如果您使用过任何所见即所得的编辑器,您应该知道这一点。如果有几个参数可以绑定到插入的图像,那么这个问题就会变得更加明显。这就是为什么我决定走这条路。完美运行,只需要解决我遇到的这个问题!
猜你喜欢
  • 2018-02-05
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多