2009-12-14 13 views
6

Ich habe die folgende Website unter Verwendung eines PHP Regex zu testen, damit habe ich nicht ständig laden: http://www.spaweditor.com/scripts/regex/index.phpPHP preg_replace nicht gierige Probleme

ich die folgende regex:

/(.*?)\.{3}/ 

auf der folgenden Zeichenkette (ersetzt mit nichts):

Non-important data...important data...more important data 

und preg_replace kehrt zurück:

more important data 

noch erwarte ich es zurück:

important data...more important data 

Ich dachte, das? ist der nicht-gierige Modifikator. Was ist denn hier los?

+0

Welche Einstellungen sind auf der Website, die Sie mit Ihnen verbunden ersetzen? Ich habe es gerade ausprobiert und habe wie erwartet "nicht wichtige Daten" zurückbekommen. Ihr regulärer Ausdruck findet die erste Übereinstimmung und ergreift so wenig wie möglich, bevor ein "..." gefunden werden kann. –

+0

@Doug Neiner: Stellen Sie auf seiner Website sicher, dass Sie 'preg_replace' im letzten Abschnitt ausgewählt haben. Ich konnte die Ergebnisse des OP auf diese Weise reproduzieren. – Asaph

+1

Ah, sehr wahr. Hat die falsche ausgewählt. –

Antwort

8

Ihr nicht gieriger Modifikator funktioniert wie erwartet. Aber preg_match ersetzt alle Vorkommen der (nicht gierigen) Übereinstimmung mit dem Ersetzungstext ("" in Ihrem Fall). Wenn nur der erste ersetzt werden soll, können Sie 1 als optionales 4. Argument (Grenzwert) an preg_replace (PHP docs for preg_replace) übergeben. Auf der verlinkten Website kann dies durch Eingabe von 1 in die Texteingabe zwischen dem Wort "Flags" und dem Wort "limit" erreicht werden.

+1

+1 @Assaph, große Antwort. Ich hatte "preg_match" anstelle von "preg_replace" gewählt, als ich den Link ausprobierte, also ging es mir durch den Duft. Sie sind natürlich völlig richtig in Ihrer Antwort! –

0

nur ein aktuelles Beispiel für @Asaph-Lösung. In diesem Beispiel brauchen Sie keine Nicht-Gierigkeit, weil Sie eine Anzahl angeben können. nur das erste Vorkommen von @ in einer Linie mit einem Marker

$line=preg_replace('/@/','zzzzxxxzzz',$line,1);