Я строю расширение для Opencart 2.3.x, и мне нужно заменить все вхождения DIR_IMAGE
с _DIR_IMAGE
Итак, я придумал это регулярное выражение, которое работает только с PHP, но не в моде 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);
Может кто-то указать мне верное направление? На данный момент я предполагаю, что альтернативы вышеприведенному выражению приветствуются.
Прежде всего, вы должны указать двигателю использовать регулярное выражение с regex=true
приписывать.
Другая проблема заключается в том, что g
не поддерживается PHP preg_replace
, он заменяет все вхождения по умолчанию.
Кроме того, вам не нужны группы, потому что .*?
не ограничивайте контекст (подсказка: .*?
в конце шаблона никогда соответствует чему угодно, значение группы всегда является пустой строкой, потому что оно ленивое и даже не пробуется), вы можете просто использовать
<search regex="true" position="replace"><![CDATA[/DIR_IMAGE/]]></search>
<add><![CDATA[_DIR_IMAGE]]></add>
Обратите внимание, что регулярное выражение будет иметь больше смысла, если вам нужно ограничить контекст, в котором вы подходите DIR_IMAGE
, Если вам нужно соответствовать DIR_IMAGE
это еще не предварительно с _
использование
<search regex="true" position="replace"><![CDATA[/(?<!_)DIR_IMAGE/]]></search>
^^^^^^
Поскольку вы используете блок CDATA, вам не нужно <
в негативном взгляде (?<!_)
это не соответствует, если есть _
непосредственно слева от текущего местоположения.
Других решений пока нет …