【问题标题】:PHP replace string using overlapping regular expressionsPHP使用重叠的正则表达式替换字符串
【发布时间】:2015-04-30 07:26:56
【问题描述】:

如何使用重叠的正则表达式替换字符串?

你好!我试图将 html 标签添加到字符串中。我使用函数 preg_replace(),但是当我在数组中的模式重叠时 preg_replace 不起作用。

$string = 'abc';
$patterns[0] = '/a/';
$patterns[1] = '/abc/';
$replacements[0] = '<b>$0</b>';
$replacements[1] = '<i>$0</i>';
echo preg_replace($patterns, $replacements, $string);

这会产生以下输出:

<b>a</b>bc

但我期待这个输出:

<b><i>a</b>bc</i>

似乎 preg_replace 采用第一个模式并将其替换为第一个替换,然后搜索第二个模式,但它在 modified 字符串中搜索。 我必须使用支持正则表达式的函数。

【问题讨论】:

  • 您知道&lt;b&gt;&lt;i&gt;a&lt;/b&gt;bc&lt;/i&gt; 是无效标记吗?您需要 &lt;i&gt;&lt;b&gt;a&lt;/b&gt;bc&lt;/i&gt; 才有效!
  • 是的,这不是问题
  • 问题的一部分是正则表达式不是适合这项工作的工具,DOM 是正确的工具
  • @vks 这不是解决方案,我得到 1 个或多个正则表达式,它们可能会或可能不会定义相同的语言
  • @MarkBaker 你能解释一下如何使用 DOM 工具吗?

标签: php regex string preg-replace overlapping


【解决方案1】:

这是因为它们不是同时运行,而是循环运行。在第一个表达式之后,您最终会得到 &lt;b&gt;a&lt;/b&gt;bc,因此没有更多的 abc 可以匹配第二个表达式。

就是这样。这很好,因为您不会以无效标记结束。你会。正则表达式是 HTML 或 XML 的严重问题。

使用一些 DOM 解释器和库,例如 PHP 的 DOMDocument

【讨论】:

  • 你能解释一下如何在 PHP 中使用 DOM 库吗?我从来没有听说过...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多