使用 Regex 替换 VQMod 中所有出现的字符串

Using Regex replace all occurences of string within VQMod

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

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

这个 PHP- 只有效:

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

任何人都可以指出我正确的方向吗?在这一点上,我假设上述表达式的替代方案受到赞赏。

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

另一个问题是 PHP preg_replace 不支持 g,它会默认替换所有匹配项。

此外,您不需要这些组,因为 .*? 不限制上下文(提示:模式末尾的 .*? never 匹配任何东西,它的组值总是一个空字符串,因为它是懒惰的,甚至没有尝试过),你可以只使用

<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 块,因此如果 _ 的左侧紧邻 _,则无需在匹配失败的负后视 (?<!_) 中实体化 <当前位置。