Используя Regex, замените все вхождения строки в VQMod.

Я строю расширение для 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);

Может кто-то указать мне верное направление? На данный момент я предполагаю, что альтернативы вышеприведенному выражению приветствуются.

2

Решение

Прежде всего, вы должны указать двигателю использовать регулярное выражение с 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, вам не нужно < в негативном взгляде (?<!_) это не соответствует, если есть _ непосредственно слева от текущего местоположения.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector