You can use /(?<=then).*(?=radishes)/ to get everything between then and radishes.
$re = '/(?<=then).*(?=radishes)/';
$str = 'FIRST he ate some lettuces and some French beans, and then he ate some radishes AND then, feeling rather sick, he went to look for some parsley.';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
Break down:
- Positive Lookbehind
(?<=then): Assert that the Regex below matches
then matches the characters then literally (case sensitive)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
- Positive Lookahead
(?=radishes): Assert that the Regex below matches
radishes matches the characters radishes literally (case sensitive)
The requirement in OP is to match everything including then and radishes, so you can use /then.*radishes/ in place of /(?<=then).*(?=radishes)/
To make the regex non greedy, you should go for /then.*?radishes/ and /(?<=then).*?(?=radishes)/