What is the difference between:
They are called quantifiers.
* 0 or more of the preceding expression
+ 1 or more of the preceding expression
Per default a quantifier is greedy, that means it matches as many characters as possible.
? after a quantifier changes the behaviour to make this quantifier "ungreedy", means it will match as little as possible.
For example on the string "abab"
a.*b will match "abab" (preg_match_all will return one match, the "abab")
a.*?b will match only the starting "ab" (preg_match_all will return two matches, "ab")
You can test your regexes online e.g. on Regexr, see the greedy example here