split.s: regex zum finden von webadressen

frohes neues!

ich suche einen regex, der webadressen findet!

also quasi sowas:

$str = "dieser verlinkt auf http://forum.de.selfhtml.org/cgi-bin/fo_post oder?";

ich dachte da an sowas wie:

  
$str = =~ s{  (.*)(http://(.*))([\s\n\r\t]+)  } { $1<a href="$2">$2</a>$3 }gsx;  

leider bin ich in sachen regex nicht besonders fit wie man sieht :D

  1. Hi,

    leider bin ich in sachen regex nicht besonders fit wie man sieht :D

    macht nichts, das Problem haben andere schon gelöst.

    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
    1. leider bin ich in sachen regex nicht besonders fit wie man sieht :D

      macht nichts, das Problem haben andere schon gelöst.

      Das ist keine Lösung, sondern vorbildliche scholastische Ineffizienz.

      mfg Beat

      --
      Woran ich arbeite:
      X-Torah
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      1. Hi,

        macht nichts, das Problem haben andere schon gelöst.
        Das ist keine Lösung, sondern vorbildliche scholastische Ineffizienz.

        nicht, wenn Du damit umgehen kannst (und beispielsweise nicht benötigte Protokolle rausschmeißt). Die von Dir vorgeschlagene Variante ist übrigens das genaue Gegenteil: Eine als schlechtes Vorbild wunderbar dienende, effinziente und allem, was man lernt exklatant widersprechende RegExp, die außerhalb von Laborbedingungen versagt. Aber nun ja, die Suche nach dem Mittelweg hat ja auch was für sich.

        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
        1. macht nichts, das Problem haben andere schon gelöst.
          Das ist keine Lösung, sondern vorbildliche scholastische Ineffizienz.

          nicht, wenn Du damit umgehen kannst (und beispielsweise nicht benötigte Protokolle rausschmeißt).

          Hey das Ding war für PHP.
          Ich will da nicht einmal das nicht benötigte rausschmeissen, wenn das Notwendige nicht mal da ist.

          Die von Dir vorgeschlagene Variante ist übrigens das genaue Gegenteil:

          Steht da: Copy Paste wird mit Fehlern bestraft.
          beabsichtigt fehlende \s in [^]

          Eine als schlechtes Vorbild wunderbar dienende, effinziente und allem, was man lernt exklatant widersprechende RegExp,

          OK,OK // gehört zur Authority.
          Ansonsten, sehr humorige Beschreibung...

          die außerhalb von Laborbedingungen versagt.

          Die freie Wildbahn hält sich nicht an die RFCs. Triff die dir genehme Entscheidung.
          Der eine berücksichtigt Fragmente, der andere vergisst https...
          Der eine meint, er müsse jeden Part validieren, als ob das dem Nutzen entgegenkäme.

          Aber nun ja, die Suche nach dem Mittelweg hat ja auch was für sich.

          Will ich so stehenlassen.

          mfg Beat;

          --
          Woran ich arbeite:
          X-Torah
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
          1. Hi,

            Hey das Ding war für PHP.

            nö, für Perl. Jemand hat es nur in PHP verwendet.

            Ich will da nicht einmal das nicht benötigte rausschmeissen, wenn das Notwendige nicht mal da ist.

            Das da wäre?

            Die von Dir vorgeschlagene Variante ist übrigens das genaue Gegenteil:
            Steht da: Copy Paste wird mit Fehlern bestraft.

            Ja, das ist das gute an Deiner Antwort :-)

            Die freie Wildbahn hält sich nicht an die RFCs. Triff die dir genehme Entscheidung.
            Der eine berücksichtigt Fragmente, der andere vergisst https...
            Der eine meint, er müsse jeden Part validieren, als ob das dem Nutzen entgegenkäme.

            Ja, ja und ja. Man sollte bei Anpassungen von etwas Komplexen an die eigenen Bedürfnisse jedoch mit etwas beginnen, das per se erst einmal _richtig_ ist - falsch machen ist leicht, korrigieren nicht, zumindest nicht in diesem Maßstab.

            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. Ich brauche nur einen Filter für HTTP-Adressen! Ich habe ein Fotoalbum gebastelt und will eine Kommentarfunktion für die Bilder machen. In den Kommentaren soll man auch Adressen zu anderen Seiten angeben können und das sollen nur HTTP-Adressen sein (also keine FTP, HTTPS usw.).

        Ich will lediglich Urls finden und diese in ein <a href="$1">$1</a> reinpacken.

        1. Ich brauche nur einen Filter für HTTP-Adressen! Ich habe ein Fotoalbum gebastelt und will eine Kommentarfunktion für die Bilder machen. In den Kommentaren soll man auch Adressen zu anderen Seiten angeben können und das sollen nur HTTP-Adressen sein (also keine FTP, HTTPS usw.).

          Ich will lediglich Urls finden und diese in ein <a href="$1">$1</a> reinpacken.

          Willst du auch URIs finden, die gar nicht als Link gedacht waren?

          Warum stellst du nicht eine Syntax zur Verfügung, die dir das einwandfreie Erkennen von intendierten Links im Gegensatz zu Linkbeispielen erlaubt?

          Beispiel

          [weblink:[uri:][label:]]
          oder die shorthandform
          [weblink:]

          mfg Beat

          --
          Woran ich arbeite:
          X-Torah
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
  2. ich suche einen regex, der webadressen findet!
    also quasi sowas:
    $str = "dieser verlinkt auf http://forum.de.selfhtml.org/cgi-bin/fo_post oder?";

    ich dachte da an sowas wie:

    $str = =~ s{  (.)(http://(.))([\s\n\r\t]+)  } { $1<a href="$2">$2</a>$3 }gsx;

      
    Es ist unnötig, Dinge zu matchen, die nicht zu einer https? uri gehören.  
      
    (http://(.\*))  
    ist denkbar ungeeignet, da "." auf whitespace und bei deiner Angabe m//s auch auf \n matcht.  
      
    Eine https URI würde ich unterteilen in verschiedene Nutzanteile:  
      
    ~~~perl
    my $schema = qr! https?:// !x;  
    my $authority = qr! [^/?#]+ !x;  
    my $path = qr! / (?: [^?#]+ ) !x;  
    my $query = qr! \?[^#]+ !x;  
    my $fragment = qr! #\S* !x;  
      
    my $re = qr!  
         (  
           (  
             (  
                $schema $authörity  
             )  
             (?:$path $guery ? )?  
           )  
           $fraqment ?  
         )  
         !x;  
      
    $text =~ s/$re/<a href="$1" title="$1">$3</a>/xg;  
    
    

    Ich nehme nicht die ganze URI für die Linkbeschriftung, sondern nur den Authority Part. Die ganze URI ist aber im title sichtbar.

    Bitte nicht einfach copy-pasten. das wird bestraft durch Errormessages.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o