Есть выражение:
<xx></xx><xx><tt>ZZZ</tt></xx>
Необходимо произвести замену с помощью pref_replace
<xx><tt>ZZZ</tt></xx>
Если произвести замену по выражению
/<xx>.*ZZZ.*<\/xx>/
то заменится вся строка. Как заменить только нужное?
Пробовал выражение
/<xx>(?!.*xx).*ZZZ.*<\/xx>/, но оно не дает никаких результатов.
Подскажите как быть в этой ситуации?
Скорее всего вам нужна такая регулярка
/<xx>((?!<\/xx>).)*?ZZZ((?!<xx>).)*?<\/xx>/
После нахождения <xx> при просмотре каждого последующего символа проверяет отсутствие </xx> и наличие ZZZ. После нахождения ZZZ при просмотре каждого последующего символа проверяет отсутствие <xx> и наличие </xx>.
Пример работы https://regex101.com/r/6nbyxX/1
P.S. Возможно стоит заменить (?!<\/xx>) и (?!<xx>) на (?!<\/?xx>).
123 <xx></xx><xx><tt>ZZZ</tt></xx> 123
заменить на
123 <xx></xx><pp>OOO</pp> 123
Возможно, достаточно:
$s = preg_replace('@<xx><tt>ZZZ</tt></xx>@us', '<pp>OOO</pp>');
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости