Rolle: preg_match_all

Beitrag lesen

preg_split('/([(?:COMMA|SPACE|NEWLINE|SPACE|TITLE)(?:=[^]]*)?])/', $s, 0, PREG_SPLIT_DELIM_CAPTURE);

Prima, vielen Dank! Wieso entstehen bei dem Ausdruck eigentlich leere Werte?

Bei Deinem Beispiel hat das Array zwei leere Einträge und bei meinen Tests habe ich auch ständig welche.

preg_split() trennt die Zeichenkette an den Stellen auf, die auf das gegebene Muster passen, wobei die Trennstellen normalerweise nicht in das Ergebnis einfließen.

Würde "a,b,c" an den Kommata getrennt werden, kämen "a", "b" und "c" raus, die Kommata als Trenner fallen weg. Bei "a,,b" wäre das Ergbnis dementsprechend "a", "" (nichts) und "b", denn zwischen den beiden Kommata steht ja nichts.
Das ist zugegebenermaßen etwas anders als bei der vielleicht naheliegendsten Anwendung so einer Texttrennung, der Aufzählung aller Wörter eines Satzes, wo direkt aufeinander folgende Trenner, d.h. Leerzeichen, zu einer einzelnen Leerstelle zusammengefasst werden ("zwei  Leerzeichen" -> "zwei", "Leerzeichen").

Da preg_split() als Option noch PREG_SPLIT_DELIM_CAPTURE bekommen hat, gibt die Funktion die Trenner bzw. die in runden Klammern stehenden Teile der Trenner ebenfalls zurück (_DELIM_CAPTURE für "delimiter capture", in etwa "Trenner mitnehmen"). Als Trenner benennt das Muster, grob gesagt, die in eckigen Klammern stehenden Teile, also [COMMA], [SPACE] etc.

In "Name[COMMA][SPACE]Vorname" finden wir nun das Gleiche wie in "a,,b": Einen Text ("Name"), einen Trenner ("[COMMA]"), Nichts (""), einen Trenner ("[SPACE]") und einen Text ("Vorname") – genau dies gibt preg_split() mit PREG_SPLIT_DELIM_CAPTURE zurück. Daher die leeren Einträge: Das sind die Stellen, an denen zwei eckige Ausdrücke direkt aufeinandertreffen.

Stören dich die leeren Einträge, benutze PREG_SPLIT_NO_EMPTY als zusätzliche Option.