Регулярное выражение SKIP-FAIL с несколькими шаблонами для игнорирования в одном регулярном выражении PCRE - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь заменить одну строку другой, но только если в ней нет двойных или одинарных кавычек.Я могу сделать это для двойников, но у меня есть проблемы с включением синглов.

Я использую preg_repalce с массивом, потому что у меня также есть другие правила для применения к строке.

$text = <<<DATA
I love php
"I love php"
'I love php'
"I" love 'php'
DATA;

$text = preg_replace(
    [
     '/"[^"]*"(*SKIP)(*FAIL)|\blove\b/i'
    ],
    [
     'hate'
    ],
    $text
);

echo $text;

ивывод

I hate php     -> OK
"I love php"   -> OK
'I hate php'   -> NOT OK
"I" hate 'php' -> OK

моя проблема заключается в одинарных кавычках

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

В качестве альтернативы вы можете также захватить группу для захвата одинарной или двойной кавычки и обратной ссылки для совпадения с той же кавычкой:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';

RegEx Demo

Код PHP:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';
$text = preg_replace($re, 'hate', $text);

Код Demo

2 голосов
/ 02 апреля 2019

Вам необходимо сгруппировать альтернатив, которые вы хотите пропустить, и избегать одинарных кавычек, когда вы используете строковый литерал в одинарных кавычках:

'/(?:\'[^\']*\'|"[^"]*")(*SKIP)(*FAIL)|\blove\b/i'
  ^^^          ^       ^

См. regex demo .

Теперь (*SKIP)(*FAIL) будет применяться к обеим альтернативам, \'[^\']*\' и "[^"]*".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...