[PHP] Funktion für URL-Ersetzung



  • Ein einzelnes Komma als Endpunkt zu sehen ist auch gefährlich (hatte ich in das alte UBB eingebaut), denn alle Spiegel Artikel haben ein Komma in der URL. Ich würde anstelle ein ", " (Komma Leerzeichen) als Endzeichen nehmen.



  • Stimmt, das ist auch eine gänge Praxis wenn man das Apache Rewriter-Modul einsetzt... z.B. für's phpBB usw.

    Ehrlich gesagt weiß ich gar nicht, was alles gültige Symbole für URLs sind... muß mal in den RFCs nachsehen.





  • Oha.

    Siehe hier:

    unreserved     = alpha | digit | safe | extra
    uchar          = unreserved | escape
    
    httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
    hpath          = hsegment *[ "/" hsegment ]
    hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    

    und dazu gehört:

    extra          = "!" | "*" | "'" | "(" | ")" | ","
    

    Im Klartext: eine URL darf mit einer ) enden... demnach ist es in einem Fließtext nicht so einfach möglich zwischen (hier die Quelle unter http://something.de/strange) und http://something.de/strange) zu unterscheiden. Man müßte sich den Gesamtkontext ansehen...



  • Aber den Fehler würde ich in kauf nehmen. Mir ist noch nie eine Klammer in einer URL aufgefallen und dann noch am Ende wäre sehr komisch bzw. unwahrscheinlich (also wieder auf ein ") " achten).



  • Dann aber auf ein ") "|")." Denn die Kombination "wie zu sehen ist (siehe auch http://www.gurgle.de)." ist nicht so unwahrscheinlich.



  • Ich habe immer folgende Funktion für das umwanlden benutzt, vielleicht hilft sie dir ja weiter. Wobei ich dazu sagen muss das diese Funktion nur Urls welche am Anfang und am Ende ein Leerzeichen haben umwandelt, was den Vorteil hat, dass der HTML Tag für Links, sofern vorhanden, nicht zersört sondern einfach nicht beachtet wird.

    function createurl($content)
    {
       $reurl = "/(\s)((http|ftp):\/\/(www\.){0,1}([a-zA-Z0-9\-\.])*(\.)(de|at|com|info|co.uk|ca|dk)([a-zA-Z0-9\.\-\_\?\/\=\&])*)(\s)/"; 
       $returnurl = preg_replace($reurl, " \\2 ", $content);
       return $returnurl;
    }
    

    Ich hab die Funktion aus einem fertigen CMS ausgekoppelt, aber eigentlich müsste sie funktionieren.. 🙂



  • Gerard schrieb:

    der eigentlich code sieht so aus (mit ein mod von mir der überlange urls kürtz)

    function make_clickable($text)
    {
    
    	// pad it with a space so we can match things at the start of the 1st line.
    	$ret = ' ' . $text;
    
    //<modifikation>
    //<name>Zu lange Urls kürtzen</name>
        //matches an "xxxx://yyyy" URL at the start of a line, or after a space.
        // xxxx can only be alpha characters.
        // yyyy is anything up to the first space, newline, comma, double quote or <
        $ret = preg_replace_callback("#(^|[\n ])([\w]+?://[^ \"\n\r\t<]*)#is", 'url_callback', $ret);
    
        // matches a "www|ftp.xxxx.yyyy[/zzzz]" kinda lazy URL thing
        // Must contain at least 2 dots. xxxx contains either alphanum, or "-"
        // zzzz is optional.. will contain everything up to the first space, newline,
        // comma, double quote or <.
        $ret = preg_replace_callback("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#is", 'http_url_callback', $ret);
    //</modifikation>
    
    	// matches an email@domain type address at the start of a line, or after a space.
    	// Note: Only the followed chars are valid; alphanums, "-", "_" and or ".".
    	$ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\" class=\"postlink\" style=\"text-decoration:underline\">\\2@\\3</a>", $ret);
    
    	// Remove our padding..
    	$ret = substr($ret, 1);
    
    	return($ret);
    }
    //<modifikation>
    //<name>Zu lange Urls kürtzen</name>
    function url_callback($m)
    {
        $t = $m[2];
        if(strlen($m[2]) > 110)
        {
            $rechts = substr($m[2], 0, 50);
            $links  = substr($m[2], strlen($m[2]) - 50, 50);
            $t = $rechts.' ....... '.$links;
    
        }
        return $m[1].'<a href="'.$m[2].'" target="_blank" style="text-decoration:underline">'.$t.'</a>';
    }
    
    function http_url_callback($m)
    {
        $t = $m[2];
        if(strlen($m[2]) > 110)
        {
            $rechts = substr($m[2], 0, 50);
            $links  = substr($m[2], strlen($m[2]) - 50, 50);
            $t = $rechts.' ....... '.$links;
    
        }
        return $m[1].'<a href="http://'.$m[2].'" target="_blank" style="text-decoration:underline">'.$t.'</a>';
    }
    //</modifikation>
    

    es steht dir frei es zu verbessern, ich habe zu zeit mit andern sachen zu tun

    Nur mal so eine ganz, ganz doofe Frage:

    Wie würde das denn aussehen müssen, wenn zusätzlich noch urls in links nach dem gleichen Schema umgewandelt werden sollen, die das format (LINK)http://xxx.yy(/LINK) haben?

    Ich hab mir da schon einen Wolf gesucht aber steig durch diese pattern einfach nich durch (wahrscheinlich bin ich zu blöd dafür)!



  • el Clio schrieb:

    Wie würde das denn aussehen müssen, wenn zusätzlich noch urls in links nach dem gleichen Schema umgewandelt werden sollen, die das format (LINK)http://xxx.yy(/LINK) haben?

    Irgendwie verstehe ich nicht so ganz, was du jetzt machen willst 😕



  • flenders schrieb:

    el Clio schrieb:

    Wie würde das denn aussehen müssen, wenn zusätzlich noch urls in links nach dem gleichen Schema umgewandelt werden sollen, die das format (LINK)http://xxx.yy(/LINK) haben?

    Irgendwie verstehe ich nicht so ganz, was du jetzt machen willst 😕

    Ok! Also ich habe auf meiner HP ein Board, wo man auch links angeben kann, indem man vorher den Tag "(LINK)" und hinterher "(/LINK)" setzt, also (LINK)http://www.url.de(LINK).
    Ich hab das immer so gemacht, dass ich den Text dann nach diesen Tags geparst hab und die dann entsprechend ersetzt hab.
    Das Ergebnis war dann <a href="http://www.url.de">Link</a>, was ansich auch schon ok ist.
    Aber:
    1. ist das ganze ziemlich umständlich und auch nicht sonderlich Wartungsfreundlich und
    2. gefällt mir das nicht, dass im angezeigten Text dann nur "Link" steht und die URL nicht zusehen ist.
    Ich möchte also, dass mein (LINK)http://www.url.de(LINK) umgewandelt wird in <a href="http://www.url.de">http://www.url.de</a> (bzw. wenns zu lang ist eben auch wie in dem Beitrag oben gekürzt wird).

    Ich hab auch schon versucht den ganzen Spass oben anzupassen, bin aber wohl zu doof dazu... 😢



  • Versuch es mal so:

    $string = preg_replace("#(^|[\n ])\(LINK\)([^ \"\n\r\t<]*)\(/LINK\)#i", "\\1<a href=\"\\2\">\\2</a>", $string);
    


  • flenders schrieb:

    Versuch es mal so:

    $string = preg_replace("#(^|[\n ])\(LINK\)([^ \"\n\r\t<]*)\(/LINK\)#i", "\\1<a href=\"\\2\">\\2</a>", $string);
    

    Joh! Super! So funzt das! Habs noch ein wenig verfeinert, aber alleine hätt ich das nie geschafft!

    Super dickes Danke!!!



  • Das einzige, was dabei zu beachten war ist eben, dass du die Klammern maskieren musst 😉


Anmelden zum Antworten