Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Regexp und die Gierigkeit
Antwort
 
Themen-Optionen
Alt 29.01.2006, 13:36   Nach oben    #1
CIX88
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 576
Standard [PHP] Regexp und die Gierigkeit

RegExp - Gierig oder nicht ?

Oft werde ich gefragt, was mit »Gier« bei regulären Ausdrücken eigentlich gemeint ist.
Die »Gier« bei regulären Ausdrücken wird somit begründet:
Reguläre Ausdrücke suchen immer die größtmöglichste Anzahl von Zeichen,
die kann mit dem Modifer U unterdrückt werden.
Anhand von keinen Beispielen möchte ich darauf mal eingehen.

Nehmen wir an, wir suchen alle Buchstaben in einer Zeichenkette mit preg_match_all().

PHP-Code:
$string 'the quick brown fox jumps over the lazy dog'
Benutzen wir dazu ein einfachen Ausdruck:

PHP-Code:
// unser Ausdruck
$ausdruck '([a-z])+';
$regexp '#'.$ausdruck.'#i'
Zur Erklärung:

Code:
 delimiter pattern (was wird gesucht) delimiter modifer
 #         ([a-z])+                   #         i

 ([a-z])+ = Suche eine Gruppe von Zeichen,
            welche aus Buchstaben von a-z besteht,
            diese können/müssen einmal, oder beliebig oft vorkommen
Im unseren kleinen Beispiel benutze ich den Modifer i, um die Groß- und Kleinschreibung ausser acht zu lassen.
Würden wir jetzt diese Beispiel anwenden, würden wir folgendes Array zurück erhalten:

Code:
[0] => Array
        (
            [0] => the
            [1] => quick
            [2] => brown
            ...
            [6] => the
            [7] => lazy
            [8] => dog
        )
Jetzt möchten wir uns die »gierigkeit« mal etwas näher betrachten, und erweitern unsern regulären Ausdruck um den Modifer U.

PHP-Code:
// unser Ausdruck
$ausdruck '([a-z])+';
$regexp '#'.$ausdruck.'#iU'
Nach dem anwenden erhalten wir nun folgendes Array:

Code:
    [0] => Array
        (
            [0] => t
            [1] => h
            [2] => e
            ...
            [32] => d
            [33] => o
            [34] => g
        )
Was ist passiert ?

Mit dem Modifer U wurde nun die Gier unterdrückt, also nicht auf die größtmöglichste Anzahl von Zeichen suchen.
Da unser Quantor ein + ist, hat es nun zufolge, dass er jeden einzelnen Buchstaben erkennt.
Wir erinnern uns:

Quantor + = Das Zeichen kann/muss einmal oder beliebig oft vorkommen.

Der Modifer U sagt jetzt praktisch dem Quantor "eh du, suche nur einmal, nicht alles" ...

Zum Schluss noch ein Beispiel:

Ich habe ein Korb mit 10 Äpfel.
Anstatt alle auf einmal zu nehmen, nehme ich nur ein einen aus dem Korb.
-> also »gierigkeit« unterdrückt


Ich hoffe, ich konnte das Verhalten von Gier etwas näher bringen.
MfG CIX88

(Änderungen vorbehalten)
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zum Tut: [PHP] Fremde Webseiten auslesen the_cRu PHP-Programmierung 27 10.02.2007 19:59
Werte in einen Regexp einsetzen. ex³ PHP-Programmierung 6 02.02.2007 07:27
regexp Datums-Vervollständigung ex³ PHP-Programmierung 10 12.02.2006 16:16
[MySQL] REGEXP Problem Jay Datenbanken 3 27.12.2005 13:52
[PHP] Ein einfaches Template-System MrNiceGuy Tutorials 0 09.10.2005 18:30


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:21 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44