$re = '/^ # begin of string
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 1th capturing group
(?:\brain\b|\bsunlight\b|\bbark) # Alternation group (answers) \b word-boundaries as needed
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:\1|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:\2|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:\1|\2|\3)).)* # anything that is not captured by group 1,2,or 3
$ # end of string/xmi';
$str = 'rain. bright sunlight. a dog\'s bark.
rain. bright rain. a dog\'s bark.
Barksunlight rain
bark sun rain
bar sunlight sunlight
Rain rain rain
sunlight rain bark
Barking dog, sunlight, rainforest
Barking elephant, green Sunlight, purple rain and other non-sense
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php