Есть файл:
cat file.txt
dog blah crocodile blah dog blah cat blah crocodile blah dog blah crocodile blah dog blah cat blah dog blah cat blah crocodile blah dog blah crocodile blah mice blah cat blah crocodile
Что я пытаюсь сделать достигать:
каждое слово крокодил
должно быть заменено, но не должно заменяться, если между словами собака
(или мыши
) и крокодил
есть слово cat
Примерно так:
dog blah replacement blah dog blah cat blah crocodile blah dog blah replacement blah dog blah cat blah dog blah cat blah crocodile blah dog blah replacement blah mice blah cat blah crocodile
Мой прогресс:
$txt = preg_replace('/((dog|mice)(.*?)(?:(?!cat))(.*?))crocodile/', "$1replacement", $txt);
Каждое бла
слово означает что угодно.
После получения отзывов о Meta этот вопрос (к моему удивлению) относится к теме, поэтому я объясню одну рабочую технику.
Я нахожу ваше простое английское объяснение требований к шаблону немного нечетким, поэтому мне нужно уточнить, что мой шаблон:
dog
или ] mice
, затем dog
, mice
и cat
] не найдены при поиске слова крокодил
тогда крокодил
, затем \ K
для "освобождения" всех ранее использованных символов - это позволяет использовать только слово крокодил
в качестве соответствия полной строки - которое будет заменено ... но проверка еще не завершена ... затем крокодил
не следует строка cat
перед тем, как следовать собакой
или мышами
.Шаблон:
/(?:dog|mice)(?:(?!dog|mice|cat).)* \Kcrocodile(?= (?:(?!dog|mice|cat).)* (?:dog|mice))/
Замена:
Replacement
Код PHP: ( Демо )
$txt = 'dog blah crocodile blah dog blah cat blah crocodile blah dog blah crocodile blah dog blah cat blah dog blah cat blah crocodile blah dog blah crocodile blah mice blah cat blah crocodile';
echo preg_replace('/(?:dog|mice)(?:(?!dog|mice|cat).)* \Kcrocodile(?= (?:(?!dog|mice|cat).)* (?:dog|mice))/', 'replacement', $txt);
// output is identical to what is expected in your question.
Я не включаю какие-либо метасимволы границы слова, потому что мне трудно угадать из вашей сфабрикованной входной строки, если это необходимо. Есть вероятность, что включение в шаблон \ b
повысит точность.
шт. некоторые примечания по синтаксису ...
(?: ...)
- это группа без захвата (?! ...)
- это негативный прогноз. (? = ...)
- положительный прогноз.