(?s|i)<h2>.*(?!(</h2>))</h2>Вначале пытаюсь сказать, что точка должна схватывать и переводы строк (s), плюс всё делается независимо от регистра (i). После этого пытаюсь сказать, что мне нужно всё, что угодно, что находится между “<h2>” и “</h2>”, но в этом “между” не должно попадаться самого “</h2>” (чтобы получить действительно все заголовки H2, а не отрезок документа между первым и последним таким заголовком).
Исправьте, please…