RuD: Regulärer Ausdruck für Links

Beitrag lesen

Seid gegrüßt!

Danke dass du dir die Ziet nimmst mir das zu erklären.

reguläre Muster in PHP brauchen einen Delimiter. Das ist das erste Zeichen, das den Anfang markiert, und das logischerweise auch am Ende wieder stehen muss.

Gut, das wusste ich, dass Delimiter gestezt werden müssen. Mir sind blos selbstdefinierte unbekannt.

[code lang=php]
$tpl_source = preg_replace('
  ~(<a href="        // was macht die Tilde da? Den Anfang markieren?

// OK, jetz klar!

.*                // Ist klar: Alle Zeichen, egal wieviele
   [^?]+)

// also NICHT ein oder mehrere Fragezeichen, wieso ist das nicht escaped?

Das ist eine Character Class. Sie bedeutet: Ein Zeichen dessen, was in den eckigen Klammern steht. Wenn ein Zirkumflex (oder wie das Dach da heißt) in einer Character Class enthalten ist, dann negiert es ihre Bedeutung. Hier bedeutet sie nun "ein Zeichen, das kein Fragezeichen ist". Das Pluszeichen nimmt davon so viele, wie es kriegt, aber mindestens eines. Dein Pfad besteht doch aus mindestens einem Nicht-?-Zeichen, oder?

Ja tut er ;-)

(?:?([^"]+))?"~', // Und hier ist alles zu spät

Hier will ich mal von innen anfangen:
  [^"]+                 // wie oben: NICHT ein oder mehrere " (?)
  ?                    // davor ein Fragezeichen
  das ? am Ende         // macht das ganze zur später wieder einzufügenden "Varbiable"

(?:...)               // ich habs noch nicht geschnallt
                        // was genau wird vergessen

Diese Parenthese (äußeres Klammernpaar) soll nicht "gemerkt" werden, denn ich will ja eigentlich nur die innere Klammer haben, daher (?: ... ), denn sonst stünde im Ersetzungsstring später ein "\1" und ein "\3", aber kein "\2" - klar?

Nicht wirklich .-(

Jetzt will ich als erstes ein echtes Fragezeichen haben. Das ist aber mit einer Sonderbedeutung belegt. Deshalb muss ich für ein echtes Fragezeichen dieses mittels Backslash escapen. Daher steht hier ?, klar?
In der Klammer will ich alle Zeichen, die keine doppelten Anführungszeichen sind, also wieder eine negierte Character Class. Im Klartext will ich also alles zwischen (?) und ("), nämlich den Search-String. Klar soweit?

Teils teils....

Und jetzt kommt's: Das alles könnte da im Link auch garnicht stehen, denn manche Links haben ja keinen Search-String! Deshalb ist diese Klammer mit dem nicht-merken-Schalter optional, also mit einem nachfolgenden Fragezeichen (welches ganz genau betrachtet "einmal oder kein mal" bedeutet) versehen.

Die ganze Kombination kapier ich nicht

Bei weiteren Fragen kommst Du wieder! Aber ich hätte da einen Linktipp für Dich: http://www.regular-expressions.info

Schöne Seite, sehr ausführlich aber ENGLISH, gibt es eine eben so gute deutsch Seite!

--
Bis Später
    
________________________________________________________________
[Testversion meiner Seite] [Zwei unterwegs in Australien]