Seite 1 von 1

RegularExpressions: - trennen, aber -- nicht

Verfasst: 06.11.2006, 19:33
von wuschba
Hi! Ich habe ja schon ein bißchen was mit RegExpr gemacht, aber da weiß ich nicht weiter: Wie kann ich einen String mittels preg_split aufsplitten, und zwar an jedem "-", aber NICHT an "--". Beispiel:
Wort1-Wort2--Wort3-Wort4
=>
Wort1
Wort2--Wort3
Wort4

Bin für jeden Ansatz dankbar.

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Re: RegularExpressions: - trennen, aber -- nicht

Verfasst: 06.11.2006, 20:02
von haha
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.