esta función lo utilicé como un método estático de una de mis clases, pero ahora te lo dejo como una función.
Código PHP:
function parserLink($url)
{
return preg_replace(
array('/(?(?=<a[^>]*>.+<\/a>)(?:<a[^>]*>.+<\/a>)|([^="\']?)((?:https?|ftp|bf2|):\/\/[^<> \n\r]+))/iex','/<a([^>]*)
target="?[^"\']+"?/i','/<a([^>]+)>/i','/(^|\s)(www.[^<> \n\r]+)/iex','/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)(\\.[A-Za-z0-9-]+)*)/iex'),array("stripslashes((strlen('\\2')>0?'\\1<a href=\"\\2\">\\2</a>\\3':'\\0'))",'<a\\1','<a\\1 target="_blank" class="enlace01">',"stripslashes((strlen('\\2')>0?'\\1<a href=\"http://\\2\" target=\"_blank\" class=\"enlace01\">\\2</a>\\3':'\\0'))","stripslashes((strlen('\\2')>0?'<a href=\"mailto:\\0\" class=\"enlace01\">\\0</a>':'\\0'))"),$url);
}