У вас есть четыре проблемы:
Во-первых, вы используете регулярные выражения для разбора HTML.
В-третьих, вы слишком много подходите: вам нужно хотя бы сделать некоторые квантификаторы ленивыми, т.е. е. используйте .*?
, [\s\S]*?
и т. д., или ваше регулярное выражение будет сопоставлять все до конца строки или файла, а затем только откатить назад столько, сколько необходимо, чтобы найти последний возможный соответствующий тег.
В-четвертых, вы настроили себя на катастрофическое возвращение назад, имея повторяющиеся группы внутри повторяющихся групп, каждая из которых имеет множество способов сопоставления одного и того же текста.
Как я понимаю ваш вопрос, вы хотите сопоставить все, начиная от первого тега <style>
и заканчивая конечным </body>
, и захватить все содержимое тегов <style>
и содержимое тега <body>
. Правильно? Тогда попробуйте
/(<style[\s\S]+<\/style>)[\s\S]*?<body.*?>([\s\S]+)<\/body>/i
Чтобы захватить каждый блок <style>
по отдельности, можно попробовать максимум четыре <style>
блока:
/(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*<body.*?>([\s\S]+)<\/body>/i
, если блоки <style>
все смежные и разделены только пробелами. Вы понимаете, почему не рекомендуется использовать для этого регулярное выражение?