我正在为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);
有人能指出我正确的方向吗?在这一点上,我认为上述表达的替代方案是值得赞赏的。
答案 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>
^^^^^^
中授权<
位置。