Попробуйте:
~<pizza><onion>((?:(?!</onion>|default).)*)</onion><tomato>((?:(?!</tomato>).)*)</tomato></pizza>~s
Или эквивалент, но с включенным флагом x
:
~
<pizza>
<onion>
(
(?:(?!</onion>|default).)* # anything not containing `</onion>` and `default`
)
</onion>
<tomato>
(
(?:(?!</tomato>).)* # anything not containing `</tomato>`
)
</tomato>
</pizza>
~sx # enable DOT-ALL (s), and COMMENTS (x)
, где ~
- разделитель.
Если ваш источник имеет комментарии, <!-- possible tags -->
или может иметь произвольное количество вложенных тегов, я настоятельно рекомендую вместо этого использовать некоторый (X) анализатор HTML-кода.