Thomas: preg_match() - reguläre Ausdrücke verarbeiten

Hi!

Ich hab ne Funktion:
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?

thx
Thomas

  1. Hi,

    $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
    Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?

    daran ist falsch, dass "[(.*)]" auf ein(!) Zeichen matcht, welches "(", ".", "*" oder ")" ist.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

    Du gibst also an, dass in '$text' der Rückgabewert von 'preg_match()', der entweder 0 oder 1 ist, gespeichert wird, und gleichzeitig willst du in '$text' den Treffer speichern lassen.

    Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?

    Genau das, was Cheatah schon geschrieben hat. Wenn wirklich beabsichtigt ist, das der Subpattern '(.*)' den Inhalt von '$1' enthält (nur nebenbei, ein Variablenname darf nicht mit einer Zahl beginnen), so wirst du diesen ändern müssen. Denn dieser Subpattern würde, wenn er nicht in einer Zeichenklasse stände, auf jedes mögliche Zeichen matchen. Aufgrund des '*' nach dem '.' und der Tatsache, dass dieser Regex ungready ist, würde dieser Subpattern einen leeren String zurückliefern.

    mfg
    Rato

    --
    §§§
    Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
    §§§
    1. Hi!

      Eigentlich meinte ich folgendes:
      $text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
      nach preg_match sollte dann folgendes stehn:
      $text = "Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.";

      => vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
      $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

      Danke
      Thomas

      1. Hallo Thomas.

        Eigentlich meinte ich folgendes:
        $text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
        nach preg_match sollte dann folgendes stehn:
        $text = "Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.";

        => vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
        $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

        1. Du meinst vermutlich eigentlich preg_replace. Ansonsten würdest du mit obigem Kommando das Ergebnis der Ersetzung als Array in $text ablegen und dies sogleich darauf wieder verwerfen, da du in die gleiche Variable den Rückgabewert von preg_match hineinschreiben lässt.

        2. Rückreferenzen im Ersatzstring gehören zu diesem und sind keine plötzlich definierten Variablen

        3. Du übernimmst den gesamten Inhalt der eckigen Klammern, ohne den Namen zu extrahieren.

        Zusammenfassend also:

        $text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";  
          
        $text = preg_replace('!\[name=(.*)\]!U',  
                             '<a href="[hostname]/$1">$1</a>', $text);  
        echo $text; // Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.
        

        Einen schönen Montag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. Hallo nochmal.

          $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

          1. Du meinst vermutlich eigentlich preg_replace. Ansonsten würdest du mit obigem Kommando das Ergebnis der Ersetzung als Array in $text ablegen und dies sogleich darauf wieder verwerfen, da du in die gleiche Variable den Rückgabewert von preg_match hineinschreiben lässt.

          An meinem Vorschlag ändert sich nichts, aber meine Anmerkung ist Quark. Dazu hätte $text sowohl das zweite als auch das dritte Argument für preg_match sein müssen.

          Einen schönen Montag noch.

          Gruß, Mathias

          --
          ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
          debian/rules
      2. Hi,

        $text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
        nach preg_match sollte dann folgendes stehn:

        preg_match ändert den zu prüfenden String nicht.

        => vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
        $text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);

        Du willst etwas ersetzen (replace), nicht nur finden (match).

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.