【问题标题】:Using Regex replace all occurences of string within VQMod使用正则表达式替换 VQMod 中所有出现的字符串
【发布时间】:2017-09-11 12:58:36
【问题描述】:

我正在为 Opencart 2.3.x 构建一个扩展,我需要用 _DIR_IMAGE 替换所有出现的 DIR_IMAGE ,所以我想出了这个仅适用于 PHP 的正则表达式,但不适用于 VQMod mod:

<operation error="log">
    <search position="replace"><![CDATA[/(.*?)(DIR_IMAGE)(.*?)/g]]></search>
    <add><![CDATA[$1_DIR_IMAGE$3]]></add>
</operation>

这个 PHP-only 确实有效:

preg_replace('/(.*?)(DIR_IMAGE)(.*?)/g', '$1_DIR_IMAGE$3', $string);

谁能指出我正确的方向?在这一点上,我假设上述表达式的替代方案受到赞赏。

【问题讨论】:

  • PHP 正则表达式不支持g 修饰符。 preg_replace 默认替换所有不重叠的事件。 Besdies,您需要使用 regex="true" 才能使用正则表达式。 &lt;search regex="true"&gt;
  • @AD7six 因为我正在使用 VQMod,它是用于覆盖原始文件的第三方代码。这是唯一的方法。
  • @WiktorStribiżew 我尝试使用 ~exp~ 无济于事,还有 /exp/
  • 添加正则表达式属性并重试 - &lt;search regex="true"&gt;
  • @WiktorStribiżew 你是对的,我忘记了正则表达式属性,我很少使用它,所以我什至不记得.. 请写下你的答案,以便我标记它。谢谢!

标签: php regex vqmod opencart2.3


【解决方案1】:

首先,您需要告诉引擎使用带有regex=true 属性的正则表达式。

另一个问题是 PHP preg_replace 不支持 g,它默认替换所有出现的位置。

此外,您不需要组,因为.*? 不限制上下文(提示:模式末尾的.*? 从不 匹配任何内容,其组值始终为一个空字符串,因为它是惰性的,甚至没有尝试过),你可以使用

<search regex="true" position="replace"><![CDATA[/DIR_IMAGE/]]></search>
<add><![CDATA[_DIR_IMAGE]]></add>

请注意,如果您需要限制匹配 DIR_IMAGE 的上下文,则正则表达式会更有意义。如果您需要匹配尚未与 _ 预先匹配的 DIR_IMAGE,请使用

<search regex="true" position="replace"><![CDATA[/(?<!_)DIR_IMAGE/]]></search>
                                                  ^^^^^^

由于您使用的是 CDATA 块,因此如果在当前位置的左侧紧邻有 _,则无需在匹配失败的负向后向 (?&lt;!_) 中实体化 &lt;

【讨论】:

  • 不知道这如何应用于 op,但正则表达式 /\bDIR_IMAGE\b/(即使用单词边界)比使用捕获组更合适。
  • @AD7six 可以,但我们没有实际要求。当然,单词边界可能会限制匹配,并使使用正则表达式更加明智。我添加了一个正则表达式,它只匹配那些在DIR_IMAGE 子字符串之前没有_DIR_IMAGEs。
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多