This is bugging me:
Why preg_match('/pattern/', $haystack) instead of preg_match('pattern', $haystack)? Everything I’ve seen just states as a fact that they’re necessary, and mentions that you can use alternate delimiters.
But, it’s a function that defines its own interface outside of the string. It has a flags argument. Adding intra-string syntax seems capricious.
Is it something inherited from pcre that the authors were just not interested in working around? Yet another perverse fact of PHP? Or is there a justification?
The delimiters are for compatibility with Perl. Perl regular expressions use the delimiters, and rely on the end delimiter to signify the start of modifier flags, like
ifor case insensitivity, for example.The optional flags argument to
preg_match()does not implement the regular expression flags likeithat follow the second delimiter. They serve a different function, and indeedPREG_OFFSET_CAPTUREis the only flag available there. This is not to say the regex flags could not have been implemented as another function parameter. They certainly could have, but Perl-compatibility is the goal here.PHP is not the only language that borrows directly from Perl to implement regular expressions. JavaScript does to some degree, and Ruby even implements Perl’s
=~operator for regular expression matches.