Sascha: HTML-Link erstellen

Hallo Leute,

ich bekomme in einer Variable einen beliebig langen Text.
Dieser Text wird später mit print ausgeben.

Dieser Text kann auch einen Internet-Link enthalten (http://......)
Nun will ich das dieser Link erkannt und in einen html-link umgewandelt wird.

z.B.:
$text = "Das ist ein Test. http://www.test.de TOLL";

soll in
$text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
umgewandelt werden.

Alle meine bisherigen Versuche das mit regulären Ausdrücken hinzubekommen sind fehlgeschlagen!

WER KANN MIR HELFEN?

Danke

Sascha

  1. Moin,

    z.B.:
    $text = "Das ist ein Test. http://www.test.de TOLL";

    soll in
    $text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
    umgewandelt werden.

    Schuss ins blaue (habs nicht getestet):

    $text =~ s/(http://\S+)\s*(\S+)/<a target='_blank' href="$1">$2</a>/gis;

    Gruss,
    Joerg

    1. äh, falsch, sorry:

      $text =~ s/(http://\S+)/<a target='_blank' href="$1">$1</a>/gis;

      meinte ich :)

      1. Tag Jörg.

        $text =~ s/(http://\S+)/<a target='_blank' href="$1">$1</a>/gis;

        Ähm, was passiert wenn ich sowas schreibe:
        Nähere Infos findest du in Google (http://www.google.de).
        Nähere Infos findest du unter http://www.google.de.

        Nene, so geht das nicht :)
        Der RegEx im Posting von Dennis sieht da schon besser aus.

        Siechfred

        --
        »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
        1. Moin,

          Nene, so geht das nicht :)

          Ok, ich bin davon ausgegangen, dass Links immer die gleiche form wie im Beispiel angegeben haben (durch Leerzeichen getrennt vom restlichen Text) haben.
          Dann muss hanstatt des \S+ eine entsprechende Zeichenklasse rein
          sowas wie [a-zA-z0-9./%...oehm, und was halt noch alles in einem Link stehen darf.
          Die Begrenzung von "mindestens 3" in Dennis posting "(3,)"
          funzt aber nicht, z.B.:
          http://selfhtml.org
          kriegt man damit nicht.

          1. Tag Jörg.

            Nene, so geht das nicht :)
            Ok, ich bin davon ausgegangen, dass Links immer die gleiche form wie im Beispiel angegeben haben (durch Leerzeichen getrennt vom restlichen Text) haben.

            Naja, Links zu parsen ist nicht wirklich einfach, vielleicht hilft dem OP dieser RegExp oder gar das komplette Modul weiter (habe es mir nicht näher angesehen).

            Siechfred

            --
            »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
          2. Hi Jörg,

            Die Begrenzung von "mindestens 3" in Dennis posting "(3,)"
            funzt aber nicht, z.B.:
            http://selfhtml.org
            kriegt man damit nicht.

            erst mal: {3,} (geschwungene Klammer)

            ähm, warum sollte das auf http://selfhtml.org nicht matchen?
                                             \__________/
                                            sind doch wohl mehr als 3 Zeichen

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
            Zufällige Hinweise:
            ------------------------
            Newbies aufgepasst: Auf viele Fragen findet man eine
            Antwort im Archiv, das man auch durchsuchen kann
  2. Versuchs damit:

    $text =~ s/(http://.* )/<p><a target="_blank" href="$1">$1</a></p>/g;

    nicht getestet

    1. Versuchs damit:

      $text =~ s/(http://.* )/<p><a target="_blank" href="$1">$1</a></p>/g;

      nicht getestet

      Moment, so wäre besser

      $text =~ s/(http://.*\ )/<p><a target="_blank" href="$1">$1</a></p>\ /g;

  3. Hi Sascha,

    Alle meine bisherigen Versuche das mit regulären Ausdrücken hinzubekommen sind fehlgeschlagen!

    Also folgendes hat sich bei mir mit PHP bewährt, das wandelt http://, ftp:// und mailto: Links um, wobei das Title Attribut entsprechend angepasst wird und mailto: Links nicht in einem neuen Fenster geöffnet werden:

    //Externe Links aus dem Text herrausfiltern
    $links = preg_match_all("=<(http://|ftp://|mailto:)([a-zA-Z0-9._-:?&/=@#~>{3,})]=U", $text, $treffer);

    //Und durch HTML Link ersetzen
    if($links)
    {
     foreach($treffer[0] as $key => $value)
     {
      $link = "<a href="".$treffer[1][$key].$treffer[2][$key].""";
      if($treffer[1][$key] == "mailto:") $link .= " title="E-Mail schreiben">".$treffer[2][$key]."</a>";
      else $link .= " title="Externer Link" target="_blank">".$treffer[1][$key].$treffer[2][$key]."</a>";

    $text = str_replace($value, $link, $text);
     }
    }

    Vielleicht kriegst du das ja zu Perl umgemurkst ;-)

    Ansonsten kann es vielleicht ein anderer brauchen....

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
    Zufällige Hinweise:
    ------------------------
    Newbies aufgepasst: Auf viele Fragen findet man eine
    Antwort im Archiv, das man auch durchsuchen kann
  4. Hallo!

    $text = "Das ist ein Test. http://www.test.de TOLL";

    soll in
    $text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
    umgewandelt werden.

    Unten wurde schon fast eine funktionierende Lösung vorgeschlagen.
    Einige Backslash zur Maskierung wären dort noch notwendig.

    So sollte es funktionieren:
    $text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;

    Grüße
    saltun

    1. So sollte es funktionieren:
      $text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;

      oh ja stimmt, aber man sollte doch folgendes benutzen
      $text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

      Gruß

      Sebastian

      1. Hallo Sebastian!

        So sollte es funktionieren:
        $text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;

        oh ja stimmt, aber man sollte doch folgendes benutzen
        $text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

        Der String, auf den die RegExp angewandt werden soll lautet:
        $text = "Das ist ein Test. http://www.test.de TOLL";

        Mit (http://.*) speicherst Du "http://www.test.de TOLL" in $1.
        Die Ausgabe ist dann ....href='http://www.test.de TOLL'>http://www.test.de TOLL</a></p>.
        Deshalb braucht man das Ende der URL, also hier .de.  Das Fragezeichen ist beim gegenständlichen
        String nicht notwendig, hat aber den Sinn, Perl dazu zu bringen, beim ersten .de aufzuhören.

        Probier einfach einmal dieses kleine Perl-Script aus:

        #!/usr/bin/perl
        $text = "Das ist ein Test. http://www.test.de TOLL ";
        $text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;
        print ("$text\n");

        Nimm dann das Fragezeichen weg und probier das Script mit dem String
        $text = "Das ist ein Test. http://www.test.de TOLL und jetzt kommt noch ein .de";
        und Du wirst sehen was ich meine.

        Grüße
        saltun

        1. Hi Satun,

          bei meinem Code ist die URL bei einem Leerzeichen zu ende!!!
          $text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

          dafür sorgt das \ in der Funktion hinter der Klammer!!!

          Gruß Sebastian

          1. Hallo!

            Hi Satun,

            bei meinem Code ist die URL bei einem Leerzeichen zu ende!!!
            $text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

            dafür sorgt das \ in der Funktion hinter der Klammer!!!

            Dein Code gibt den folgenden String aus:

            Das ist ein Test. <p><a target='_blank' href='http://www.test.de TOLL'>http://www.test.de TOLL</a></p>

            Das " TOLL " soll jedoch nicht in der URL selber stehen. Das Ergebnis, das Sascha will, soll so

            Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL

            aussehen. Das Wort TOLL soll  n a c h  dem </p> stehen.

            Grüße
            saltun

            1. trotzdem besteht das im meinem anderen Post genannte Problem, dass  das ganze nur mit .de geht und wenn mann zumbespiel an die Addresse ?typ=0&test=0 dranhängt das ganze nicht mehr funktioniert !!!

              Gruß

              Sebastian

              1. Hallo Sebastian!

                trotzdem besteht das im meinem anderen Post genannte Problem, dass  das ganze nur mit .de geht und wenn mann zumbespiel an die Addresse ?typ=0&test=0 dranhängt das ganze nicht mehr funktioniert !!!

                Du hast mit dem Leerzeichen als Begrenzung der URL natürlich recht, da in einer URL kein Leerzeichen vorkommen darf. (Ich sehe manchmal den Wald vor lauter Bäumen nicht).

                Das Fragezeichen ist allerdings dann notwendig, wenn nach der URL mehr als ein Wort steht.

                Grüße
                saltun

                1. Hi Saltun

                  Folglich wäre der passende Parser für ihn folgender:

                  $text =~ s/(http://.*?)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

                  Leider funktioniert der nicht bei z.B.:

                  $text = "Das ist ein Test.<br>Link: http://www.test.de |Ende des Links|<br> Noch nen Link: http://www.test.domain.de";

                  hier wird nur der erste Link geändert, wie nicht der zweite?

                  1. Hallo Sebastian!

                    Folglich wäre der passende Parser für ihn folgender:

                    $text =~ s/(http://.*?)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;

                    Leider funktioniert der nicht bei z.B.:

                    $text = "Das ist ein Test.<br>Link: http://www.test.de |Ende des Links|<br> Noch nen Link: http://www.test.domain.de";

                    hier wird nur der erste Link geändert, wie nicht der zweite?

                    Ganz einfach, der zweite Link hat kein Leerzeichen am Ende. Der Suchausdruck passt also nicht und die Substitution wird nicht durchgeführt.
                    Mach am Ende des Strings nach de ein Leerzeichen, dann funktioniert es.
                    Oder ohne Leerzeichen mit meiner ursprüngliche Variante (aber dann mit /g;).

                    Ohne Kenntnis aller Links in einem Text  wird die Erstellung eines umfassend funktionierenden regulären Ausdrucks nur schwer möglich sein, das heißt, man muss ein auf alle Fälle passendes Muster finden.

                    Grüße
                    saltun

        2. Ok, jetzt hab ich auch gemerkt, das da mehr reingelade wird, frage meinerseitz wieso??? eigentlich sollte doch bei dem Leerzeichen aufhören *grübel*

          String nicht notwendig, hat aber den Sinn, Perl dazu zu bringen, beim ersten .de aufzuhören.

          Was machst du bei anderen Addressen oder wenn es hinter der Addresse mit ?typ=0&test=blub weitergeht?