2017-09-11 56 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。 –