Jeg skal forsøge:
Med "e" tilføjet efter # vil preg_replace("#..."#e", ..., ...) lave et såkaldt callback, dvs. at den kalder den funktion som står på plads nr. 2:
"strtoupper('\\1')"
Den kalder altså strtoupper(), men du kunne også have haft ucfirst() i stedet. Der bliver altså kaldt en funktion som konvertere "noget" til stort.
Hvad er dette "noget" så for noget?
Det regulære udtryk ser sådan her ud:
\b(\w)
Her matcher \b som sagt "starten af et ord".
Derefter kommer (\w). \w matcher "a-zA-Z0-9_" dvs. "et bogstav, et tal eller _" (med en setlocale - se
http://www.eksperten.dk/spm/731459 - vil den også matche æ, ø, og å).
(...) - parenteserne betyder blot at det der er matchet skal huskes til senere. Det bliver husket som \\1 - 1 fordi at det er den første parentes (og den eneste) i det regulære udtryk. Men \\1 er jo netop det som vi puttede ind i kaldet til strtoupper() ovenfor.
Altså:
1) Det regulære udtryk:
\b(\w)
- matcher "starten af et ord", efterfulgt af "et bogstav, et tal eller en understreg".
1b) Det er selvfølgelig kun bogstaverne vi er interesseret i, men de andre tegn bliver alligevel ikke påvirket af strtoupper().
2) Det bogstav der er i starten af ordet, bliver husket under navnet \\1.
3) Via det lille e (som står for "evaluate") bliver der lavet et callback til strtoupper('\\1').
Resultat:
Alle bogstaver som står i starten af et ord bliver konverteret til stort bogstav.