2011-01-13 17 views
1

ich über regex studierte, dachte ich, eine passenden einige etwa oder mehr Charakter, aber ich habe einen Fall, aber nicht wissen, wie diese zu lösen ..in PHP Brauchen Sie Hilfe Regex

Zum Beispiel ich habe :

$data = "bla bla -start- blu blu blu -end- bla bla"; 
$pattern = "/\-start\-[\w]\-end\- /"; 
preg_match($pattern, $data, $matches); 
print_r($matches); 

ich habe vor, etwas zu nehmen zwischen '-Start-' und '-end-', so erwarte ich bekommen
'blu blu blu'.
irgendein Vorschlag?

Antwort

4

\w stellt nur Wortzeichen dar und Sie müssen auch Leerzeichen zulassen. Angenommen, Sie möchten wirklich alles zwischen -start- und -end- zulassen, können Sie . verwenden, das mit jedem Zeichen übereinstimmt.

Bindestriche müssen nicht entgangen sein, es sei denn in einem Zeichenmuster eingeschlossen (in eckigen Klammern [ und ]), so können Sie \- mit nur - ersetzen.

Genau wie ein einzelne \w unter Verwendung eines beliebigen einzelne Wortzeichen steht für passende stellt . jeden einzelnen Charakter passend, so dass Sie in ein paar mehr Informationen hinzufügen müssen. Entweder von diesem Anschluss mit + anzeigen würde mindestens passend ein Zeichen, oder mit einem * würde Null oder mehr Zeichen angeben. Vorausgesetzt, dass Sie mindestens ein Zeichen wollen, sollte Ihr Ausdruck wie dies in Ordnung sein:

$pattern = "/-start-(.+)-end- /"; 

Angenommen, Sie könnten einen Ausdruck begegnen wie: -start- foo -end- -end- und Sie möchten auf der ersten -end- beenden (der Gehalt an foo zu extrahieren), dann müssen Sie auf nicht-gierige Weise arbeiten. PHP Regex ist gierig standardmäßig kann das deaktiviert, Sie folgen dem + (oder eine *) mit einem ?, wie folgt aus:

$pattern = "/-start-(.+?)-end- /"; 
+0

Bindestriche nicht außer in Zeichenklassen entwertet werden müssen. Ihre Antwort ist ansonsten genau richtig. – coreyward

+0

@coreyward: Ich dachte nicht und checkte - lief einen schnellen Test und vor allem die Flucht hat nichts gebrochen. Wie auch immer, entsprechend aktualisiert. –

+0

Obwohl seine Frage es nicht erwähnt, wenn zwischen '-start-' und '-end-' Newline-Zeichen vorhanden sind, sollten Sie den "dot-all" -Modifikator von 's' festlegen. Daher '$ pattern ="% -start- (. +?) -end-% six ";' Ich benutze auch den 'x'-Modifizierer, um die Lesbarkeit mit komplexen Mustern zu erhalten, da die Engine Whitespace ignoriert (beachte dabei) Sie müssen dem Muster dann Leerräume hinzufügen, wenn Sie es über '\ s' einbeziehen möchten, sowie den Modifizierer' i' für die Groß-/Kleinschreibung. – Dan