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);