使用正则表达式替换VQMod

时间:2017-09-11 12:58:37

标签: php regex vqmod opencart2.3

我正在为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可以工作:

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

有人能指出我正确的方向吗?在这一点上,我认为上述表达的替代方案是值得赞赏的。

1 个答案:

答案 0 :(得分:3)

首先,您需要告诉引擎使用带有removeNissan(car) { return car.type !== "nissan"; } 属性的正则表达式。

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

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

.*?

请注意,如果您需要限制匹配<search regex="true" position="replace"><![CDATA[/DIR_IMAGE/]]></search> <add><![CDATA[_DIR_IMAGE]]></add> 的上下文,则正则表达式更有意义。如果您需要匹配尚未预先添加DIR_IMAGE的{​​{1}}

DIR_IMAGE

由于您使用的是CDATA模块,因此如果当前左侧有_,则无需在匹配失败的否定后备<search regex="true" position="replace"><![CDATA[/(?<!_)DIR_IMAGE/]]></search> ^^^^^^ 中授权<位置。