2017-09-11 5 views
2

Ich baue eine Erweiterung für Opencart 2.3.x und ich muss alle Vorkommen von DIR_IMAGE durch _DIR_IMAGE ersetzen, so kam ich mit diesem regulären Ausdruck, der mit PHP allein funktioniert, aber nicht innerhalb eines VQMod mod:Regex ersetzen alle Vorkommen von String innerhalb von VQMod

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

Diese PHP-only funktioniert:

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

Kann mir jemand in die richtige Richtung? An dieser Stelle nehme ich an, dass Alternativen zu dem obigen Ausdruck geschätzt werden.

+2

PHP regex unterstützt den Modifikator 'g' nicht. 'preg_replace' ersetzt standardmäßig alle nicht überlappenden Vorkommen. Besdies, Sie müssen 'regex =" true "' verwenden, um eine Regex verwenden zu können. '' –

+0

@ AD7six, weil ich VQMod benutze, welches ein Drittes Stück Code ist, um Originaldateien zu überschreiben. Es ist der einzige Weg. – yoda

+0

@ WiktorStribiżew Ich versuchte mit ~ exp ~ ohne Erfolg, und auch/exp/ – yoda

Antwort

3

Zuallererst müssen Sie die Engine anweisen, eine Regex mit regex=true Attribut zu verwenden. Ein weiteres Problem ist, dass g nicht von PHP preg_replace unterstützt wird, es ersetzt standardmäßig alle Vorkommen.

Außerdem Sie die Gruppen nicht brauchen, weil .*? nicht den Kontext beschränken (einen Hinweis: die .*? am Ende des Musters nie alles paßt, ist sein Gruppenwert immer eine leere Zeichenfolge, weil sie faul ist und wird versucht, nicht einmal), können Sie nur

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

Hinweis verwenden, dass ein regulärer Ausdruck mehr Sinn machen, wenn Sie den Kontext beschränken müssen, wo Sie DIR_IMAGE entsprechen. Wenn Sie DIR_IMAGE übereinstimmen, die nicht bereits mit _ Verwendung

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

preprended Da Sie einen CDATA-Block verwenden, gibt es keine Notwendigkeit < im negativen Lookbehind (?<!_) entitize, die das Spiel schlägt fehl, wenn _ sofort ist auf der linken Seite des aktuellen Standortes.

+0

Ich weiß nicht, wie dies für das op gilt, aber die Regex '/ \ bDIR_IMAGE \ b /' (d. H. Die Verwendung von Wortgrenzen) ist geeigneter als die Verwendung von einfangenden Gruppen. – AD7six

+0

@ AD7six Das ist möglich, aber wir haben nicht die tatsächlichen Anforderungen. Sicher, Wortgrenzen können die Übereinstimmungen einschränken und die Verwendung einer Regex sinnvoller machen. Ich habe eine Regex hinzugefügt, die nur mit 'DIR_IMAGE's übereinstimmt, die kein' _' unmittelbar vor der 'DIR_IMAGE'-Teilzeichenkette haben. –

Verwandte Themen