Как уже сказал Мартин Йесперсен, не существует хорошего способа анализа (недействительной или действительной) разметки с помощью регулярных выражений, по крайней мере, с помощью регулярных выражений PHP.
Тем не менее, если вы только ищете способ удалить
- несбалансированные угловые скобки
- между допустимыми тегами
- , которые не содержат угловых скобок где-то внутри значений их атрибутов
тогда вам может это сойти с рук:
$intermediate = preg_replace('/(>[^<>]*)<([^<>]*<)/', '\1<\2', $subject);
$result = preg_replace('/(>[^<>]*)>([^<>]*<)/', '\1>\2', $intermediate);
но вам придется запускать это несколько раз, пока не останется больше совпадений, потому что это поймает только одну паузу <
или >
между тегами за раз. Также произойдет сбой в псевдосбалансированных скобках, таких как <p> a <> b </p>
.