christian: url wird doppelt geparst

Hallo,
ich habe ein kleines Problem, auf dessen (sicherlich einfache) Lösung ich einfach nicht komme:

Per Eingabefeld (textarea) kann man auf meiner Seite einen Eintrag in meine Datenbank machen. Falls irgendwo Links in diesem Text sind werden die geparst:

$text= preg_replace("/((http(s?)://)|(www.))(([\w-.]+)(/[[1]]+)*)/i", "[url="http$3://$4$5"]$2$4$5[/url]", $text);

Aus http://www.xy.de wird also [url=http://www.xy.de]http://www.xy.de[/url]

Soweit also kein Problem.
Wenn der Benutzer jedoch in seinem Text selber schon einen solchen Link erzeugt z.B. konkret [url=http://www.xy.de]Hier klicken[/url] schreibt,
wird der erste Teil (http://www.xy.de)doppelt geparst und das ist natürlich falsch.

Wie kann ich verhindern, dass nur solche Links geparst werden, die nicht innerhalb von [url] [/url] stehen??

Gruß
christian


  1. :space: ↩︎

  1. Hallo!

    $text= preg_replace("/((http(s?)://)|(www.))(([\w-.]+)(/[[1]]+)*)/i", "[url="http$3://$4$5"]$2$4$5[/url]", $text);

    Wenn du ausschließen kannst, dass bei den Tags vor dem http kein space kommt, könnstest du das Zeichen vor dem http befragen:

    ... [^=]http ...

    Also das Zeichen vor http darf kein "="-Zeichen sein. Ob da noch ein Backslash hinzukommt, mußt du ausprobieren.

    lg ad


    1. :space: ↩︎

    1. Wenn du ausschließen kannst, dass bei den Tags vor dem http kein space kommt, könnstest du das Zeichen vor dem http befragen:

      ... [^=]http ...

      Also ich hab es jetzt folgendermaßen ausprobiert:

      $text= preg_replace("/(([^=]http(s?)://)|(www.))(([\w-.]+)(/[[1]]+)*)/i", "[url=http$3://$4$5]$2$4$5[/url]", $text);

      Allerdings hat sich im Ergebnis bisher nichts geändert


      1. :space: ↩︎

      1. Morgen!

        $text= preg_replace("/(([^=]http(s?)://)|(www.))(([\w-.]+)(/[[1]]+)*)/i", "[url=http$3://$4$5]$2$4$5[/url]", $text);

        Allerdings hat sich im Ergebnis bisher nichts geändert

        War nur ein Denkansazt, den ich selbst nicht getestet habe. Liegt aber wohl daran, dass es eine OR-Bedingung ist. Es wird hier nicht nur nach http sondern auch nach www gesucht. Dort müsste es dann auch ausgeschlossen werden, oder gleich nach der ersten Klammer.

        Was du auch noch versuchen könntest ist (^[url=)

        lg ad


        1. :space: ↩︎

  2. echo $begrüßung;

    Wie kann ich verhindern, dass nur solche Links geparst werden, die nicht innerhalb von [url] [/url] stehen??

    Du suchst also die Stellen, denen nicht bestimmte Zeichenfolgen vorangehen und nachfolgen. Das geht mit Assertions. Die testen auf Zeichenfolgen, ohne dass diese in das Ergebnis einfließen.

    echo "$verabschiedung $name";