2017-09-11 29 views
2

我正在构建Opencart 2.3.x的扩展,我需要用_DIR_IMAGE替换DIR_IMAGE的所有发生,所以我想出了这个正则表达式,它只与PHP一起工作,但不能一个VQMod MOD内:使用正则表达式替换VQMod中的所有字符串

<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); 

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

+2

PHP的正则表达式不支持'g'修饰符。 'preg_replace'默认会替换所有不重叠的事件。 Besdies,你需要使用'regex =“true”'才能使用正则表达式。 '' –

+0

@ AD7six因为我使用的是VQMod,它是第三方代码段来覆盖原始文件。这是唯一的方法。 – yoda

+0

@WiktorStribiżew我试着用〜exp〜无济于事,还/ exp/ – yoda

回答

3

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

另一个问题是,g不受PHP preg_replace支持,它将默认取代所有出现的事件。

此外,你不需要群体,因为.*?不限制范围内(一个提示:.*?在模式从未匹配任何内容结束后,其组值始终是一个空字符串,因为它是懒惰和甚至没试过),你可能只需要使用

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

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

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

由于您使用CDATA块,没有必要entitize <在失败的比赛负回顾后(?<!_)如果有立即_到当前位置的左侧。

+0

不知道如何适用于操作,但正则表达式'/ \ bDIR_IMAGE \ b /'(即使用单词边界)比使用捕获组更合适。 – AD7six

+0

@ AD7six这是可能的,但我们没有实际的要求。当然,单词边界可能会限制匹配,并会使正则表达式更明智。我添加了一个正则表达式,它只匹配那些在DIR_IMAGE子字符串之前没有“_”的DIR_IMAGE。 –