Using a positive view:
preg_match("%(?=.*one)(?=.*two)(?=.*three)%", $line)
EDIT: Explanation: (?=...) says "matches 0-length here if ... right away." So you can sketch it like this (with a slightly different original line to show a bit out of order):
two blah, one blah blah three ----------
(where --- - .* , and === is the search word). As each look matches, the matching position moves along the size of the match, but the lookahead match size is always 0, so it stays in place (at the beginning of the line) and allows the next view to look for the same space again.
source share