Rolle: preg_match_all

Beitrag lesen

Mahlzeit.

Name[COMMA][SPACE]Vorname[NEWLINE]Straße[SPACE]Hausnummer[NEWLINE]Postleitzahl[SPACE]Ort[TITLE=Anschrift]

Wie kriege ich mit preg_match_all alle Bezeichner und Tags getrennt in einer Liste?

Array([0] => Name [1] => [COMMA] [2] => [SPACE] [3] => Vorname [4] => [NEWLINE] 5 => Straße ...)

Das sieht eher so aus, als wenn du den Text aufteilen willst. Insofern würde ich zu preg_split greifen:

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

array(15) {
  [0]=>
  string(4) "Name"
  [1]=>
  string(7) "[COMMA]"
  [2]=>
  string(0) ""
  [3]=>
  string(7) "[SPACE]"
  [4]=>
  string(7) "Vorname"
  [5]=>
  string(9) "[NEWLINE]"
  [6]=>
  string(7) "Straße"
  [7]=>
  string(7) "[SPACE]"
  [8]=>
  string(10) "Hausnummer"
  [9]=>
  string(9) "[NEWLINE]"
  [10]=>
  string(12) "Postleitzahl"
  [11]=>
  string(7) "[SPACE]"
  [12]=>
  string(3) "Ort"
  [13]=>
  string(17) "[TITLE=Anschrift]"
  [14]=>
  string(0) ""
}

Die Tags … sind aber alle vordefiniert (COMMA|SPACE|NEWLINE|TITLE), damit u.U. auch eckige Klammern innerhalb der Bezeichner möglich sind.

Vielleicht hast du dir da etwas Spezielles gedacht, aber ob Klammern innerhalb eines Datums möglich sind, hängt nicht davon ab, ob der Datumsbezeichner definiert ist, sondern ob die Klammer maskiert werden kann.

Anders ausgedrückt: Was hilft dir die Definition von TITLE als Bezeichner bei der Entscheidung, ob [TITLE=Bla]] die Aussage "TITLE ist Bla]" meint oder "TITLE ist Bla, danach folgt der Text ]"?
Der übliche Weg, Sonderzeichen als normale Zeichen zu erlauben, ist jedenfalls die Maskierung: [TITLE=Bla]] für "TITLE ist Bla]" und TITLE=Bla]] für "TITLE ist Bla, danach folgt der Text ]". (Obiger Vorschlag beachtet eine solche Maskierung noch nicht.)

Gruß, Rolle