I was already used to PCRE syntax - the only reason I needed to use POSIX syntax was because PCRE wasn't automatically part of PHP3.
There are a whole bunch of refinements in PCRE syntax that are absent from POSIX syntax (they're mentioned on the POSIX [man]regex[/man] manual page) without which you either need to write additional code or an exponentially long regexp to achieve the same effect.
Eg., (okay, so it's a slightly artificial example). Match all strings that lie between the strings "{this}" and "{that}" which do not contain the string "{never}".
PCRE:
/{this}(?:
(?!{(?:that|never)})
.)*{that}/x
POSIX:
{this}
([^{]|{
(
[^nt]|n([^e]|e([^v]|v([^e]|e([^r]|r[^}]))))
|
t([^h]|h([^a]|a([^t]|t[^}])))
)
)*
{that}
(Remembering, of course, that you can't really break POSIX regexps up with whitespace the way you can with PCRE with the /x modifier.)
And if {this} and {that} is to be case-sensitive, but {never} is not:
PCRE:
/{this}(?:
(?!{(?:that|(?:(?i)never))})
.)*{that}/x
POSIX:
{this}
([^{]|{
(
[^nNt]|[nN]([^eE]|[eE]([^vV]|[vV]([^eE]|[eE]([^rR]|[rR][^}]))))
|
t([^h]|h([^a]|a([^t]|t[^}])))
)
)*
{that}
And then there's the /e modifier. With that, preg_replace() can literally do anything with the strings it matches that PHP can do.