wuschba hat geschrieben:Wie kann ich einen String mittels preg_split aufsplitten, und zwar an jedem "-", aber NICHT an "--"
Erster Versuch:
[^-]-[^-] (
kein Bindestrich,
Bindestrich,
kein Bindestrich).
Trennt zwar wie gewünscht, verschluckt aber dummerweise das vorangehende und nachfolgende Zeichen. Aus
WortA-WortB--WortC-WortD wird
Wort,
ortB--Wort und
ortD - das war also nix.
Zweiter Versuch:
(?<!-)-(?!-)
Gleiche Vorgehensweise, allerdings weichen die eckigen Klammern Mustern, die keine Zeichen verschlucken; in der PCRE-Anleitung werden sie lookahead bzw. lookbehind assertions genannt.
(
?<!-) prüft, ob
vor der aktuellen Position (aktuelle Position ist der Bindestrich)
kein Bindestrich steht, ohne dabei die aktuelle Position zu ändern. Zum Vergleich: [^-] aus dem ersten Versuch prüft zwar ebenfalls, ob an der aktuellen Position kein Bindestrich steht, setzt aber, falls dem so ist, die Position um ein Zeichen weiter, und verschluckt dadurch das Zeichen vor bzw. nach dem Bindestrich.
(
?!-) macht im Prinzip das Gleiche, nur prüft es statt des vorangehenden Zeichen das nachfolgende. Ersetzt man das
Ausrufungszeichen durch ein Gleichzeichen (also (?<=bla) bzw. (?=bla) ), wird eine positive Prüfung durchgeführt, d.h. ob das Muster passt (im Moment wird geprüft, ob das Muster nicht passt, also kein Bindestrich vorhanden ist).
Und damit funktioniert's dann auch.