regulärer Ausdruck in PHP: Nimm die kürzeste Übereinstimmung

8

Ich versuche, einen regulären PHP-Ausdruck zu machen, aber ich kann den richtigen Weg nicht finden ...

Stellen Sie sich vor, ich hätte diese Zeichenfolge: "Hallo, mein {{Name ist Peter}} und {{Ich möchte Schokolade essen}}"

Ich möchte die Teile zwischen {{und}}

nehmen

Aber wenn ich preg_match("/\{\{(.*)?\}\}/", $string)

verwende

es gibt mir jut einen String zurück "{{Name ist Peter}} und {{Ich möchte Schokolade essen}}"

Wie kann ich sagen, die ersten Zufälle von}} zu nehmen?

Danke

    
FlamingMoe 22.02.2011, 14:15
quelle

4 Antworten

25

Verwenden Sie

%Vor%

Der Ausdruck ".*" ist gierig und nimmt so viele Zeichen wie möglich. Wenn du ".*?" benutzt, brauchst du so wenig Zeichen wie möglich, das heißt, es stoppt bei der ersten Menge von schließenden Klammern.

    
Jens 22.02.2011, 14:17
quelle
7

Das PCRE funktioniert standardmäßig gierig. Das bedeutet, dass die Engine immer versucht, so viele Zeichen wie möglich zu finden. Die Lösung ist einfach: Sag ihm einfach, dass er mit dem Modifikator " U " nicht gierig handeln soll %Vor%

Ссылка

    
KingCrunch 22.02.2011 14:18
quelle
2

Sie möchten "nicht gierige Übereinstimmung": preg_match("/{{(.*?)?}}/", $string) .

Beachten Sie das erste Fragezeichen - eine Regex ist standardmäßig "gierig": Wenn mehrere Möglichkeiten gefunden werden, passt es so viel Text wie möglich an. Durch das Hinzufügen des Fragezeichens wird es nicht gierig. Wenn es mehrere Übereinstimmungen gibt, passt es so wenig Zeichen wie möglich an.

    
Piskvor 22.02.2011 14:18
quelle
0

BEARBEITET

Nicht-gieriges Matching scheint schneller zu sein als negiertes ( siehe hier ), ändere ich auch meine Antwort. Ich dachte, es wäre anders herum ...

%Vor%

Sie können preg_match_all verwenden, um alle Treffer zu erhalten

    
morja 22.02.2011 14:18
quelle

Tags und Links