Su php.net (alla voce preg_replace del manuale) è stata postata una soluzione dall'utente marten_berglund at hotmail dot com (la funzione linkify), eccola applicata in un esempio:

Codice PHP:
function linkify($text) {
    
$strip_lchrs "[^\s\(\)\[\]\{\}\.\,\;\:\?\!]";      //Not these chars in beginning
    
$strip_rchrs "[^\s\(\)\[\]\{\}\.\,\;\:\?\!\d]";    //Not these chars in end

    
$prot_pat $strip_lchrs "[\S]*\:\/\/[\S]*\.[\S]*" $strip_rchrs;  //abc://de.fg
    
$email_pat $strip_lchrs "[\S]*@[\S]*\.[\S]*" $strip_rchrs;      //abc@de.fg
    
$general_pat $strip_lchrs "[\S]*\.[\S]*" $strip_rchrs;          //abc.de

    
$preg_pattern "/(" $prot_pat "|" $email_pat "|" $general_pat ")/ei";
    
$preg_replace "check_preg('$1')";
    return 
preg_replace($preg_pattern$preg_replace$text);
}

function 
check_preg($subpat) {
    
//These abbr. should not be linked
    
$exc_string "/e\.g|i\.e|et\.c/i";
    
//If it says abc://de.fg
    
if (preg_match("/[\S]*\:\/\/[\S]*\.[\S]*/i"$subpat) == 1) {
        return 
"[url='" $subpat "']" $subpat "[/url]";
    }
    
//If it says [email]abc@de.fg[/email]
    
else if (preg_match("/[\S]*@[\S]*\.[\S]*/i"$subpat) == 1) {
        return 
"[email='" $subpat "']" $subpat "[/email]";
    }
    
//If it says "e.g." don't link
    
else if (preg_match($exc_string$subpat) == 1) {
        return 
$subpat;
    }
    
//If it says abc.de
    
else
        return 
"[url='http://" $subpat "']" $subpat "[/url]";
}



$testo "Scrivi in questa stringa plain text, url e mail addresses";
echo 
linkify($string);