kostenloser Webspace werbefrei: lima-city


Frage bzgl. Regex

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    Ich habe mir gerade diese Seite eines Tuts durchgelesen: http://tut.php-q.net/de/regex.html. Ich fand alles verständlich, bis ich zu dem letzten Beispiel gekommen bin. Das ist der Code:
    <?php
    $Text = 'Ein sehr Langer Text mit "besonderen" Markierungen, die dann "besonders" behandelt werden.';
    $Regex = '~"(.*)"~U';
    $Ersetzen = '<em>\1</em>';
    $Text = preg_replace($Regex, $Ersetzen, $Text);
    echo $Text;
    // Gibt folgendes aus
    // Ein sehr Langer Text mit <em>besonderen</em> Markierungen, die dann <em>besonders</em> behandelt werden.
    ?>

    Was dort steht, stimmt. Es wird einmal "<em>besonderen</em>" und einmal "<em>besonders</em>" eingesetzt. Darunter steht folgender Text zu Erklärung:
    Auf die gefundenen Strings kann man mit \$Nummer zugreifen, wobei dann entsprechend die Nummern die Gruppen sind, die man gefunden hat.
    Wendet man den Regex durch die Funktion preg_match() an, hat man die Möglichkeit dieses Array mit den Gruppen in eine Variable zu speichern. Das Element 0 ist dann der Text, der auf den Regex passt. Ab dann geht es los mit den Gruppen. Das Element 1 ist de erste Gruppe, das Element 2 ist die zweite Gruppe, usw.

    In dem Beispielcode oben wird mit \1 die erste Gruppe angefordert. Doch wieso lautet der zweite String, der eingesetzt wird "<em>besonders</em>" und nicht "<em>besonderen</em>"? Gruppe 1 bleibt doch "besonderen". Wie kommt da jetzt plötzlich Gruppe 2 ins Spiel?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 1. Benutze `$1` statt `\1`, die Syntax mit dem Backslash ist veraltet.
    2. Du verstehst das mit den Gruppen etwas falsch. `preg_replace` geht den String durch und bei jeder Übereinstimmung mit dem Regex ("Match") ersetzt es den gematchten Bereich durch den Ersetzungs-Teil.
    D.h. zuerst wird der Regex `"besonderen"` matchen. Dabei wird er sich `array('"besonderen"', 'besonderen')` als merken, da diese als Capturing Groups definiert wurden (der gesamte Regex ist automatisch eine Capturing Group). Dann ersetzt er das gematchte `"besonderen"` durch `<em>$1</em>`, wobei `$1` dem zweiten Element im Array entspricht. Das selbe macht er dann mit dem zweiten Vorkommen, das Array ist dieses mal aber `array('"besonders"', 'besonders')`. Du musst die Gruppen also nicht global, auf den ganzen String verteilt sehen, sondern lokal, bei jedem Match.

    Beitrag zuletzt geändert: 9.1.2011 12:39:05 von nikic
  4. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    Achso. Also die Arrayelemente, die schon dran waren, stellen sich wieder hinten an? Also wenn ich $2 oder \2 schreibe, dann werden die beiden Wörter gerade vertauscht?

    Oder wie muss ich mir das Vorstellen? Nehmen dir dazu lieber mal ein Array mit 5 Elementen, d.h. mit 4 "Nutzelementen". Es werden also 4 passende Stellen im Stirng gefunden. Angenommen, ich schreibe jetzt immer $3. Wie sieht die Reihenfolge aus?
  5. Du hast das mit den Gruppen ein wenig missverstanden. Jedes Klammerpaar in einem Regex stellt eine Gruppe dar, also hat dein Beispiel genau eine Gruppe und $2 existiert im Prinzip nicht.

    Wenn du deinen Regex wie folgt ergänzt:
    '~"(.*)"([^"])"(.*)"~U'
    hast du 3 Gruppen:
    $1 sollte besonderen liefern,
    $2 sollte Markierungen, die dann extrahieren und
    $3 sollte besonders liefern.
    (sollte, weil ich es nicht getestet habe, aber das Prinzip ist dir jetzt hoffentlich klar).
  6. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    Ok, natürlich, vielen Dank! Jetzt habe ich das verstanden. Oh man... Auf der Seite steht weiter oben sogar, dass man mit Klammern Gruppen angibt. Ich habe jetzt am Ende der Seite die passenden Stellen mit Gruppen verwechselt.

    D.h. (nur um das nochmal klar zu stellen): Eine Suche nach etwas, das ersetzt werden soll, kann sich so oft wiederholen, bis der String zu Ende ist. Jeder komplette Aufbau, der durch den Regex ausgedrückt wird ist eine eigene Abteilung, in der die Gruppen eigene Werte haben. In der nächsten Abteilung können die Gruppen andere Werte haben.

    Wenn das so ist, habe ich es jetzt korrekt verstanden.
  7. Hier zum testen:
    http://www.cuneytyilmaz.com/prog/jrx/
    Hat mir immer sehr geholfen.
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!