strauch: URL aus "postings" verlinken

Hallo,

ich möchte das Rad nicht neuerfinden, außerdem kann man aus anderen "Quelltexten" eine Menge lernen, deshalb meine Frage:

kann mir jemand ein Script geben oder sagen wo ich eines herbekomme, was "in" einem Skalar eine URL verlinkt, also aus:

http://www.teamone.de

<a href="http://www.teamone.de" target="_blank">http://www.teamone.de</a>

macht. Das herausfiltern geht "noch" recht einfach, findet man auch in diversen büchern, das ganze dann aber so zuersetzten und an die passende stelle zu setzten, finde ich etwas schwierig, nunja mit viel "mühe" ist sicherlich alles hinzukriegen, aber wie schon geschrieben ich möchte das Rad nicht neu erfinden.

Vielen Dank für eure Hilfe.

Gruß

André Strauch

  1. hi ho

    http://www.teamone.de
    <a href="http://www.teamone.de" target="_blank">http://www.teamone.de</a>

    du meinst:

    $url="http://www.teamone.de/";
    $link="<a href="$url" target="_blank">$url</a>";

    ?

    cua

    n.d.p.

    1. hi ho

      http://www.teamone.de
      <a href="http://www.teamone.de" target="_blank">http://www.teamone.de</a>

      du meinst:

      $url="http://www.teamone.de/";
      $link="<a href="$url" target="_blank">$url</a>";

      ?

      cua

      n.d.p.

      ne das wäreja ganz einfach folgendes:

      $message = "Hallo Leute ich habe eine Tolle Seite gefunden: http://www.teamone.de<br>Gruß<br>strauch";

      und folgendes soll daraus werden:

      $message = "$message = "Hallo Leute ich habe eine Tolle Seite gefunden: <a href="http://www.teamone.de" target="_blank">http://www.teamone.de</a><br>Gruß<br>strauch";

      Probleme sehe ich z.B. auchdarin wenn das <br> direkt an der URL klebt.

      Gruß

      strauch

      P.S. Damit ihr den Sinn versteht, das ganze soll für ein Forum und ein Gästebuch sein, so das wenn die jungs eine url eintippen die automatisch verlinkt wird.

  2. Hi!

    macht. Das herausfiltern geht "noch" recht einfach, findet man auch in diversen büchern,

    Ahem... Einfach?? Dann lies Dir das mal durch: <110363.html>!

    das ganze dann aber so zuersetzten und an die passende stelle zu setzten, finde ich etwas schwierig, nunja mit viel "mühe" ist sicherlich alles hinzukriegen, aber wie schon geschrieben ich möchte das Rad nicht neu erfinden.

    s/($URLPattern)/<a href="$1" target="_blank">$1</a>/g;

    $URLPattern musst Du durch den Ausdruck ersetzen, mit dem Du eine URL finden willst. Oder Du weist diesen Ausdruck eben an die Variable zu.

    So long

    1. Hi!

      macht. Das herausfiltern geht "noch" recht einfach, findet man auch in diversen büchern,

      Ahem... Einfach?? Dann lies Dir das mal durch: <110363.html>!

      *lol* das habe ich schon gelesen, aber ich bin noch in einer anderen Liga.

      das ganze dann aber so zuersetzten und an die passende stelle zu setzten, finde ich etwas schwierig, nunja mit viel "mühe" ist sicherlich alles hinzukriegen, aber wie schon geschrieben ich möchte das Rad nicht neu erfinden.

      s/($URLPattern)/<a href="$1" target="_blank">$1</a>/g;

      $URLPattern musst Du durch den Ausdruck ersetzen, mit dem Du eine URL finden willst. Oder Du weist diesen Ausdruck eben an die Variable zu.

      hast du einen Ausdruck mit der ich eine URL finde? Ich dachte $1 klappt nur mit $_ ?

      Gruß

      strauch

      1. hi!

        Ahem... Einfach?? Dann lies Dir das mal durch: <110363.html>!

        [...]

        s/($URLPattern)/<a href="$1" target="_blank">$1</a>/g;
        $URLPattern musst Du durch den Ausdruck ersetzen, mit dem Du
        eine URL finden willst. Oder Du weist diesen Ausdruck eben an
        die Variable zu.
        hast du einen Ausdruck mit der ich eine URL finde?

        Hm, Roland hat dir doch oben einen Link genannt, bei dem du einen
        passenden Ausdruck findest.

        Ich dachte $1 klappt nur mit $_ ?

        Diese Aussage gibt für mich überhaupt keinen Sinn. Aber vielleicht
        kannst du mir erklären, was du damit meinst? :)

        bye, Frank!

        1. hi!

          Ahem... Einfach?? Dann lies Dir das mal durch: <110363.html>!

          [...]

          s/($URLPattern)/<a href="$1" target="_blank">$1</a>/g;
          $URLPattern musst Du durch den Ausdruck ersetzen, mit dem Du
          eine URL finden willst. Oder Du weist diesen Ausdruck eben an
          die Variable zu.
          hast du einen Ausdruck mit der ich eine URL finde?

          Hm, Roland hat dir doch oben einen Link genannt, bei dem du einen
          passenden Ausdruck findest.

          Ich dachte $1 klappt nur mit $_ ?

          Diese Aussage gibt für mich überhaupt keinen Sinn. Aber vielleicht
          kannst du mir erklären, was du damit meinst? :)

          bye, Frank!

          oh gott, ich habs garnicht begriffen, mit diesem Monstercode kann also eine URL rausfiltern, nungut vielen Dank.

          Gruß

          strauch

        2. Hi,

          also ich hab das jetzt so gemacht, das hat null auswirkung, ahb ich irgendwo was übersehen (sorry aber Fehlerfinden ist immer das schwierigste):

          # Basic definitions:
             my $lowalpha       =  '(?:[a-z])';
             my $hialpha        =  '(?:[A-Z])';
             my $alpha          =  "(?:$lowalpha$hialpha)";
             my $digit          =  '(?:\d)';
             my $safe           =  '(?:[$_.+-])';
             my $extra          =  '(?:[!*'(),])';
             my $national       =  '(?:[{}\\^~[]`])';
             my $punctuation    =  '(?:[<>#%"])';
             my $reserved       =  '(?:[;/?:@&=])';
             my $hex            =  '(?:[\dA-Fa-f])';
             my $escape         =  "(?:%$hex$hex)";
             my $unreserved     =  "(?:$alpha$digit$safe$extra)";
             my $uchar          =  "(?:$unreserved$escape)";
             my $xchar          =  "(?:$unreserved$escape$reserved)";
             my $digits         =  '(?:\d+)';
             my $alphadigit     =  "(?:$alpha\d)";

          # URL schemeparts for ip based protocols:
             my $urlpath        =  "(?:$xchar*)";
             my $user           =  "(?:(?:$uchar[;?&=])*)";
             my $password       =  "(?:(?:$uchar[;?&=])*)";
             my $port           =  "(?:$digits)";
             my $hostnumber     =  "(?:$digits\.$digits\.$digits\.$digits)";
             my $toplabel       =  "(?:(?:$alpha(?:$alphadigit-)*$alphadigit)$alpha)";
             my $domainlabel    =  "(?:(?:$alphadigit(?:$alphadigit-)*$alphadigit)$alphadigit)";
             my $hostname       =  "(?:(?:$domainlabel\.)*$toplabel)";
             my $host           =  "(?:(?:$hostname)(?:$hostnumber))";
             my $hostport       =  "(?:(?:$host)(?::$port)?)";
             my $login          =  "(?:(?:$user(?::$password)?@)?$hostport)";
             my $ip_schemepart  =  "(?://$login(?:/$urlpath)?)";

          my $schemepart     =  "(?:$xchar*$ip_schemepart)";
             my $scheme         =  "(?:(?:$lowalpha$digit[+.-])+)";

          # The generic form of a URL is:
             my $genericurl     =  "(?:$scheme:$schemepart)";

          # The predefined schemes:

          # FTP (see also RFC959)
             my $fsegment       =  "(?:(?:$uchar[?:@&=])*)";
             my $ftptype        =  "(?:[AIDaid])";
             my $fpath          =  "(?:$fsegment(?:/$fsegment)*)";
             my $ftpurl         =  "(?:ftp://$login(?:/$fpath(?:;type=$ftptype)))";

          # FILE
             my $fileurl        =  "(?:file://(?:(?:$host)localhost)?/$fpath)";

          # HTTP
             my $httpuchar      =  "(?:(?:$alpha$digit$safe(?:[!*',]))$escape)";
             my $hsegment       =  "(?:(?:$httpuchar[;:@&=~])*)";
             my $search         =  "(?:(?:$httpuchar[;:@&=~])*)";
             my $hpath          =  "(?:$hsegment(?:/$hsegment)*)";
             my $httpurl        =  "(?:http://$hostport(?:/$hpath(?:\?$search)?)?)";

          # GOPHER (see also RFC1436)
             my $gopher_plus    =  "(?:$xchar*)";
             my $selector       =  "(?:$xchar*)";
             my $gtype          =  "(?:$xchar)";
             my $gopherurl      =  "(?:gopher://$hostport(?:/$gtype(?:$selector(?:%09$search(?:%09$gopher_plus)?)?)?)?)";

          # MAILTO (see also RFC822)
             my $encoded822addr =  "(?:$xchar+)";
             my $mailtourl      =  "(?:mailto:$encoded822addr)";

          # NEWS (see also RFC1036)
             my $article        =  "(?:(?:$uchar[;/?:&=])+@$host)";
             my $group          =  "(?:$alpha(?:$alpha$digit[.+_-])*)";
             my $grouppart      =  "(?:$article$group\*)";
             my $newsurl        =  "(?:news:$grouppart)";

          # NNTP (see also RFC977)
             my $nntpurl        =  "(?:nntp://$hostport/$group(?:/$digits)?)";

          # TELNET
             my $telneturl      =  "(?:telnet://$login(?:/)?)";

          # WAIS (see also RFC1625)
             my $wpath          =  "(?:$uchar*)";
             my $wtype          =  "(?:$uchar*)";
             my $database       =  "(?:$uchar*)";
             my $waisdoc        =  "(?:wais://$hostport/$database/$wtype/$wpath)";
             my $waisindex      =  "(?:wais://$hostport/$database\?$search)";
             my $waisdatabase   =  "(?:wais://$hostport/$database)";
             my $waisurl        =  "(?:$waisdatabase$waisindex$waisdoc)";

          # PROSPERO
             my $fieldvalue     =  "(?:(?:$uchar[?:@&]))";
             my $fieldname      =  "(?:(?:$uchar[?:@&]))";
             my $fieldspec      =  "(?:;$fieldname=$fieldvalue)";
             my $psegment       =  "(?:(?:$uchar[?:@&=]))";
             my $ppath          =  "(?:$psegment(?:/$psegment)*)";
             my $prosperourl    =  "(?:prospero://$hostport/$ppath(?:$fieldspec)*)";

          my $url            =  "$httpurl$ftpurl$newsurl$nntpurl$telneturl$gopherurl$waisurl$mailtourl$fileurl$prosperourl";

          $Formular[7] =~ s!$url!<a href="$&">$&</a>!g;

          Gruß

          strauch

          1. Sorry doch läuft alles, nochmals vielen Dank für eure Hilfe!

            Gruß

            strauch

          2. Hi nochmal!

            Zu dieser Sache mit $1, das gibt einfach das wieder, was im ersten Teil des s/// in Klammern steht (in meinem Beispiel den Textteil, den $URLPattern gefunden haette).

            [lots of regexps]
               my $url            =  "$httpurl$ftpurl$newsurl$nntpurl$telneturl$gopherurl$waisurl$mailtourl$fileurl$prosperourl";

            Ich nehme mal an, dass Du von all diesen URLs nur HTTP, FTP und MailTo brauchst. Den Rest kannst Du also weglassen, womit Du auch nicht mehr alles von dem davorstehenden brauchst.

            $Formular[7] =~ s!$url!<a href="$&">$&</a>!g;

            Hier wiederhole ich nochmal meinen (ungetesteten!) Verbesserungsvorschlag:
            $text =~ s!($url)!<a href="$1">$1</a>!g;
            sollte ein wenig performanter sein (wenn das noch auffaellt).

            Ich halte den Aufwand uebrigens fuer uebertrieben. Ich wuerde Links einfach so setzen lassen, wie in diesem Forum, also in [link:] einfassen (siehe http://www.teamone.de/selfaktuell/forum/forumsfaq_2.htm#a4). Geht ungefaehr so:
            s|[link:(.+?)]|<A HREF="$1">$1</A>|g;

            So long

            1. Hi,

              ja ich denke das ist eine gute Idee, zumal bei diesem Dicken ding folgendes nicht erkannt wird:

              ftp://ftp.heise.de

              Gruß

              strauch

              1. hi ho

                zumal bei diesem Dicken ding folgendes nicht erkannt wird:
                ftp://ftp.heise.de

                nur ein kleiner fluechtigkeitsfehler vom Autor .-) siehe bei FTP

                my $lowalpha       =  '(?:[a-z])';
                my $hialpha        =  '(?:[A-Z])';
                my $alpha          =  "(?:$lowalpha|$hialpha)";
                my $digit          =  '(?:\d)';
                my $safe           =  '(?:[$_.+-])';
                my $extra          =  '(?:[!*'(),])';
                my $national       =  '(?:[{}|\\^~[]`])';
                my $punctuation    =  '(?:[<>#%"])';
                my $reserved       =  '(?:[;/?:@&=])';
                my $hex            =  '(?:[\dA-Fa-f])';
                my $escape         =  "(?:%$hex$hex)";
                my $unreserved     =  "(?:$alpha|$digit|$safe|$extra)";
                my $uchar          =  "(?:$unreserved|$escape)";
                my $xchar          =  "(?:$unreserved|$escape|$reserved)";
                my $digits         =  '(?:\d+)';
                my $alphadigit     =  "(?:$alpha|\d)";

                URL schemeparts for ip based protocols:

                my $urlpath        =  "(?:$xchar*)";
                my $user           =  "(?:(?:$uchar|[;?&=])*)";
                my $password       =  "(?:(?:$uchar|[;?&=])*)";
                my $port           =  "(?:$digits)";
                my $hostnumber     =  "(?:$digits\.$digits\.$digits\.$digits)";
                my $toplabel       =  "(?:(?:$alpha(?:$alphadigit|-)*$alphadigit)|$alpha)";
                my $domainlabel    =  "(?:(?:$alphadigit(?:$alphadigit|-)*$alphadigit)|$alphadigit)";
                my $hostname       =  "(?:(?:$domainlabel\.)*$toplabel)";
                my $host           =  "(?:(?:$hostname)|(?:$hostnumber))";
                my $hostport       =  "(?:(?:$host)(?::$port)?)";
                my $login          =  "(?:(?:$user(?::$password)?@)?$hostport)";
                my $ip_schemepart  =  "(?://$login(?:/$urlpath)?)";

                my $schemepart     =  "(?:$xchar*|$ip_schemepart)";
                my $scheme         =  "(?:(?:$lowalpha|$digit|[+.-])+)";

                The generic form of a URL is:

                my $genericurl     =  "(?:$scheme:$schemepart)";

                The predefined schemes:

                FTP (see also RFC959)

                my $fsegment       =  "(?:(?:$uchar|[?:@&=])*)";
                my $ftptype        =  "(?:[AIDaid])";
                my $fpath          =  "(?:$fsegment(?:/$fsegment)*)";
                my $ftpurl         =  "(?:ftp://$login(?:/$fpath(?:;type=$ftptype)?)?)";
                #                                                                 ^ ^

                diese beiden Fragezeichen fehlten

                FILE

                my $fileurl        =  "(?:file://(?:(?:$host)|localhost)?/$fpath)";

                HTTP

                my $httpuchar      =  "(?:(?:$alpha|$digit|$safe|(?:[!*',]))|$escape)";
                my $hsegment       =  "(?:(?:$httpuchar|[;:@&=~])*)";
                my $search         =  "(?:(?:$httpuchar|[;:@&=~])*)";
                my $hpath          =  "(?:$hsegment(?:/$hsegment)*)";
                my $httpurl        =  "(?:http://$hostport(?:/$hpath(?:\?$search)?)?)";

                GOPHER (see also RFC1436)

                my $gopher_plus    =  "(?:$xchar*)";
                my $selector       =  "(?:$xchar*)";
                my $gtype          =  "(?:$xchar)";
                my $gopherurl      =  "(?:gopher://$hostport(?:/$gtype(?:$selector(?:%09$search(?:%09$gopher_plus)?)?)?)?)";

                MAILTO (see also RFC822)

                my $encoded822addr =  "(?:$xchar+)";
                my $mailtourl      =  "(?:mailto:$encoded822addr)";

                NEWS (see also RFC1036)

                my $article        =  "(?:(?:$uchar|[;/?:&=])+@$host)";
                my $group          =  "(?:$alpha(?:$alpha|$digit|[.+_-])*)";
                my $grouppart      =  "(?:$article|$group|\*)";
                my $newsurl        =  "(?:news:$grouppart)";

                NNTP (see also RFC977)

                my $nntpurl        =  "(?:nntp://$hostport/$group(?:/$digits)?)";

                TELNET

                my $telneturl      =  "(?:telnet://$login(?:/)?)";

                WAIS (see also RFC1625)

                my $wpath          =  "(?:$uchar*)";
                my $wtype          =  "(?:$uchar*)";
                my $database       =  "(?:$uchar*)";
                my $waisdoc        =  "(?:wais://$hostport/$database/$wtype/$wpath)";
                my $waisindex      =  "(?:wais://$hostport/$database\?$search)";
                my $waisdatabase   =  "(?:wais://$hostport/$database)";
                my $waisurl        =  "(?:$waisdatabase|$waisindex|$waisdoc)";

                PROSPERO

                my $fieldvalue     =  "(?:(?:$uchar|[?:@&]))";
                my $fieldname      =  "(?:(?:$uchar|[?:@&]))";
                my $fieldspec      =  "(?:;$fieldname=$fieldvalue)";
                my $psegment       =  "(?:(?:$uchar|[?:@&=]))";
                my $ppath          =  "(?:$psegment(?:/$psegment)*)";
                my $prosperourl    =  "(?:prospero://$hostport/$ppath(?:$fieldspec)*)";

                my $url            =  "$httpurl|$ftpurl|$newsurl|$nntpurl|$telneturl|$gopherurl|$waisurl|$mailtourl|$fileurl|$prosperourl";

                $text="ftp://nd:parker@ftp.heise.de";
                $text =~ s!($url)!<a href="$1">$1</a>!g;
                print $text;

                voila .-)

                cua

                n.d.p.

            2. s<(.+?)><A HREF="$1">$1</A>g;

              mhh das funktioniert so nicht, weißt du was für (.+?) rein muß? Ich versuche auch mal was zu finden.

              Gruß

              strauch

              1. Hallo Strauch!

                s<(.+?)><A HREF="$1">$1</A>g;

                mhh das funktioniert so nicht, weißt du was für (.+?) rein muß? Ich versuche auch mal was zu finden.

                $body =~ s/<(.*?)]/<a href="$1">$1</a>/gi;

                Diese Zeile (von Calo) bewirkt wenigstens im SCB, dass man Links auf gleiche Weise wie hier setzen kann. Bei Deinem Beispiel müsste das dann $text sein.

                An Calo: was ist der Unterschied zwischen (.+?) und (.*?) oder war das vorhin ein Tippfehler von Dir?

                Bis danndann
                PAF (patrickausfrankfurt)

                <img src="/selfaktuell/extras/selfcomm.jpg" alt=""> [link:http://www.atomic-eggs.com/selfspezial/guests/advguest.cgi?view>

                <img src="http://www.atomic-eggs.com/selfspezial/atomicegg.gif" id="ei" alt="Atomic Eggs - die humosophische Seite" onMouseUp="window.location.href='http://www.atomic-eggs.com/'" onmouseover="if(document.all)document.all.ei.style.cursor='hand';status='http://www.atomic-eggs.com/';return true;" onmouseout="status='';return true;">

                1. hi ho

                  An Calo: was ist der Unterschied zwischen (.+?) und (.*?) oder war das vorhin ein Tippfehler von Dir?

                  .+? ist auf mindestens ein Zeichen angewiesen, waehrend

                  .*? auch null zeichen sein kann.

                  .+? ist in diesem Zusammenhang sinnvoller, wenn auch bei weitem nicht perfekt .-)

                  cua

                  n.d.p.

                2. Huhu Patrick!

                  s|[link:(.+?)]|<A HREF="$1">$1</A>|g;

                  mhh das funktioniert so nicht, weißt du was für (.+?) rein muß? Ich versuche auch mal was zu finden.

                  $body =~ s/[link:(.*?)]/<a href="$1">$1</a>/gi;

                  Stimmt, ich hatte die \ vor [ und ] vergessen. Vor " kann man sie aber weglassen (wusste ich damals wohl noch nicht). Ausserdem kann man andere Delimiter als / verwenden, falls man den / selbst im RegExp verwenden will, um das sog. "leaning toothpick syndrome" (die /, vgl. perldoc perlop) zu vermeiden. Koennte dann z.B. so aussehen:
                  s![link:(.+?)]!<a href="$1">$1</a>!ig;

                  (Als Delimiter eigent sich fast alles, was es an ASCII-Zeichen (<127) gibt und nicht alphanumerisch (a-zA-Z0-9) ist. (? und ' haben aber Sonderbedeutungen.) Verwendet man Klammern, muss man es als  s{pattern}{replacement}ig  schreiben.)

                  An Calo: was ist der Unterschied zwischen (.+?) und (.*?) oder war das vorhin ein Tippfehler von Dir?

                  Siehe n.d. :-)

                  So long