Удалить все теги в подзаголовках

...

и

....

Необходимо удалить с помощью регулярных выражений (на PHP) все теги, которые встречаются в подзаголовках между тегами <h2>...</h2> и <h3>....</h3>.

Пример текста:

<p>слово1 слово2</p>
<h2>Какой-то <strong>подзаголовок <i class="red">второго</i></strong> уровня
</h2>
<h3><u id="green">Другой <b>подзаголовок</b> третьего</ul> уровня </h3>
<p>текст</p>

На выходе получить:

<p>слово1 слово2</p>
<h2>Какой-то подзаголовок второго уровня
</h2>
<h3>Другой подзаголовок третьего уровня </h3>
<p>текст</p>

Ответы (2 шт):

Автор решения: ksa

Необходимо удалить с помощью регулярных выражений (на PHP) все теги, которые встречаются в подзаголовках между тегами h2 и h3

Не знаю есть ли в ПХП рекурсивность в применении регулярки... Но в JS ее нет. Проблему ТС можно решить вот так.

let t = `<p>слово1 слово2</p>
<h2>Какой-то <strong>подзаголовок <i class="red">второго</i></strong> уровня
</h2>
<h3><ul id="green">Другой <b>подзаголовок</b> третьего</ul> уровня </h3>
<p>текст</p>`
const r = /(?<=<h\d.+?)<(\S+).*?>(.+?)<\/\1>/g
const rt = /<(h\d).+?<(?=.+?<\/\1)/
while (rt.test(t)) {
    t = t.replace(r, '$2')
}
console.log(t)

→ Ссылка
Автор решения: Qwertiy

Приблизительно так (можно лучше, но надо химичить): tio.run

<?php

$s = '<p>слово1 слово2</p>
<h2>Какой-то <strong>подзаголовок <i class="red">второго</i></strong> уровня
</h2>
<h3><u id="green">Другой <b>подзаголовок</b> третьего</ul> уровня </h3>
<p>текст</p>';

print preg_replace('~</?(?!h\d\b)\w+\b[^>]*>(?=((?!<h\d\b).)*</h\d>)~mis', '', $s);
→ Ссылка