preg_replace заменить ближайшее вхождение

206
30 сентября 2017, 23:30

Есть выражение: <xx></xx><xx><tt>ZZZ</tt></xx>

Необходимо произвести замену с помощью pref_replace <xx><tt>ZZZ</tt></xx>

Если произвести замену по выражению /<xx>.*ZZZ.*<\/xx>/

то заменится вся строка. Как заменить только нужное?

Пробовал выражение /<xx>(?!.*xx).*ZZZ.*<\/xx>/, но оно не дает никаких результатов. Подскажите как быть в этой ситуации?

Answer 1

Скорее всего вам нужна такая регулярка

/<xx>((?!<\/xx>).)*?ZZZ((?!<xx>).)*?<\/xx>/

После нахождения <xx> при просмотре каждого последующего символа проверяет отсутствие </xx> и наличие ZZZ. После нахождения ZZZ при просмотре каждого последующего символа проверяет отсутствие <xx> и наличие </xx>.

Пример работы https://regex101.com/r/6nbyxX/1

P.S. Возможно стоит заменить (?!<\/xx>) и (?!<xx>) на (?!<\/?xx>).

Answer 2
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>');
READ ALSO
Как отсортировать массив по шаблону?

Как отсортировать массив по шаблону?

Добрый день профессионалыПодскажите, как пересортировать элементы в массиве, что бы первым шел displayname, а не title

227
Как правильно передавать данные в класс?

Как правильно передавать данные в класс?

Работаю на Yii2Есть модель

255
Помогите найти ошибки в коде

Помогите найти ошибки в коде

Где ошибка в коде? В теории код должен работать так чтобы проверять входящие сообщение и отправлять отредактированный ответ исходя из полученногоЕсли...

230
Laravel 5.4. No query results for model при обращении к Route::post-экшену

Laravel 5.4. No query results for model при обращении к Route::post-экшену

Доброго времени сутокДелаю мягкое удаление для ресурса, при переходе в виде по ссылке "Восстановить" (ссылка посылает POST к route('announces

196