Это работало бы?
((?:.(?!<body[^>]*>))+.<body[^>]*>)|(</body\>.+)
, Конечно, необходимо добавить необходимое \s
для принятия во внимание < body ...>
(элемент с пробелами), как в:
((?:.(?!<\s*body[^>]*>))+.<\s*body[^>]*>)|(<\s*/\s*body\s*\>.+)
Вообще-то, если задуматься, я не уверен, почему мне было нужно отрицательное предвидение... Это должно также работать (на правильно построенный xhtml документ):
(.*<\s*body[^>]*>)|(<\s*/\s*body\s*\>.+)
XHTML был бы более легко проанализирован с синтаксическим анализатором XML, чем с regex. Я знаю, что это не то, что Вы спрашиваете, но синтаксический анализатор XML был бы в состоянии быстро перейти к узлу тела и дать Вам, поддерживают его содержание без любых проблем отображения тега, которые regex дает Вам.
РЕДАКТИРОВАНИЕ: В ответ на комментарий здесь; то, что синтаксический анализатор XML является слишком медленным.
существует два вида синтаксического анализатора XML, один названный DOM является большим и тяжелым и легким и дружественным, это создает дерево из документа, прежде чем можно будет сделать что-либо. Другой назван SAX и быстр и легок и больше работы, он читает файл последовательно. Вы захотите, чтобы SAX нашел Тег основного текста.
метод DOM хорош для совместных использований, вытягивая теги и находя, кто то, что является ребенком. Чтения синтаксического анализатора SAX через файл в порядке и qill быстро получают информацию, которая Вы после. Regex не будет немного быстрее, чем синтаксический анализатор SAX, потому что они оба просто идут через файл и соответствие шаблона, за исключением того, что regex не выйдет из заботы о нем, нашел тег основного текста, потому что regex имеет не созданный в знании XML. На самом деле Ваш синтаксический анализатор SAX, вероятно, использует маленькие части regex для нахождения каждого тега.
Почему Вы не можете только разделить его
</{0,1}body[^>]*>
и взять вторую строку? Я полагаю, что это будет намного быстрее, чем поиск огромного regexp.