The square bracket group means any character within the bracket selection so you are basically eliminating any words containing those letters and a comma!
This should work better and preg_match (without all) should be suffictient:
$match_exists = preg_match('#(watch|stream).+?online#i', $str);
This will match these strings:
buy watch online now!
WATCH any text here provided it's in one line(!) ONLINE
best streaming online
If you want to also catch cases when the two words are in different lines then add the 's' modifier to the end of the regex.