2010-12-09 2 views
1

Ich habe folgenden BeispieltextProblem mit regulären Ausdrücken, um in PHP passend

The quick brown {fox} jumps over the lazy {dog} 

ich jeden String eingeschlossen übereinstimmen muß in {}, die mehrmals im Text auftreten können.
Ich habe versucht, den folgenden Code, aber es funktioniert nicht richtig

<?php 

$matches = array(); 

$string = "The quick brown {fox} jumps over the lazy {dog}"; 

preg_match("/\{(.*)\}/",$string,$matches); 

print_r($matches); 

?> 

und das ist, was ich

Array 
(
    [0] => {fox} jumps over the lazy {dog} 
    [1] => fox} jumps over the lazy {dog 
) 

bekomme ich

Array 
(
    [0] => {fox} jumps over the lazy {dog} 
    [1] => fox 
    [2] => dog 
) 

So bekommen würde erwarten, wie kann ich PHP zwingen mit dem nächsten "}" übereinstimmen, anstatt mit dem letzten übereinzustimmen?

Antwort

3

Ihre bestehende regex hat .* die gierig ist und versucht so viel wie möglich zu konsumieren. Um dies zu beheben müssen Sie die regex nicht gierige machen, indem ein ? am Ende Zugabe wie:

.*? 

alternativ können Sie auch [^}]* anstelle von .* verwenden.

Und da Sie alle Spiele wollen, müssen Sie preg_match_all

See it

+0

Das funktioniert gut. Würden Sie bitte die Verwendung von erklären? in diesem Fall ? Ist diese Nutzung dokumentiert? – AssemblerGuy

+0

Die? ist ein Standardmerkmal von regulären Ausdrücken: siehe http://www.regular-expressions.info/repeat.html für Details zu Gier/Faulheit –

0

standardmäßig verwenden, Ihre regexp in gierigen Modus ausgeführt wird. Sie brauchen nicht gierig. Verwenden Sie entweder die Option/U oder den Codadict-Vorschlag von *. um diesen Teil des Ausdrucks nicht gierig zu machen

0

Ausdrücke sind standardmäßig gierig, d. h. sie versuchen, die längsten möglichen Übereinstimmungen zu erreichen. Sie können einen Ausdruck mit der U Flagge machen:

preg_match('/\{(.*)\}/U', $string, $matches); 
Verwandte Themen