Está medio enredado, pero ahora no tengo tiempo de depurarlo, fijate si así te va mejor:
  Código PHP:
    <?php 
function get_links($string) {
    $patron='/\<a href\=(.*?)\>(.*?)\<\/a\>/is';
    preg_match_all ($patron, $string,$coincidencias);
    return $coincidencias[0];
};
function get_links_text($string) {
    $patron='#[^<ref=">]http\:\/\/([^"<>]*)#is';
    preg_match_all ($patron, $string,$coincidencias);
    return $coincidencias[0];
    
};
function redlink($link,$largopartes){
    $patron='/\<a href\=(.*?)\>(.*?)\<\/a\>/i';
    preg_match_all ($patron, $link,$coincidencias);
    $s='/\<a href\=(.*?)\>(.*?)\<\/a\>/se';
    if(strlen($coincidencias[2][0])>($largopartes<<1))
        $r='"<a href=$1>".substr("$2",0,"$largopartes")."...".substr("$2","-$largopartes")."</a>"';
    else
        $r='"<a href=$1>$2</a>"';
    $t=preg_replace ($s, $r, $link);
    return $t;
}
function redlink2($link,$largopartes){
    if(strlen($link)>($largopartes<<1))
        $r='<a href="'.$link.'">'.substr($link,0,$largopartes).'...'.substr($link,-$largopartes).'</a>';
    else
        $r='<a href="'.$link.'">'.$link.'</a>';
        return $r;
}
$cadena='hola http://www.akjhas.dasa/asasa/asasasas/asas.pl <br><a href="http://www.google.com.ar">Este es un magnífico buscador y en él hay de todo</a>';
$links=get_links($cadena);
$urls=get_links_text($cadena);
foreach($links as $v){
    $replace[]=redlink($v,5);
}
foreach($urls as $v){
    $replace[]=redlink2($v,5);
}
$search=array_merge($links,$urls);
echo str_replace($search,$replace,$cadena);
?>