Cache,
вообще говоря, моя регулярка может облажаться, если в строке несколько совпадений:
'text1 a text3 aaaa text1 a text2 a text3'
здесь (?:.*?(text2)) жадничает в попытке найти text2, и проскакивает text3.
Поправка:
/(text1)(?:(?:(?!text3).)*?(text2))?.*?(text3)/
- теперь мы проверяем точки, чтобы не проскочить.