codice:
function urlLength( $url, $length ) {
	$st = '<a href="'.$url.'">';
	if( ( $a = strlen( $url ) ) > $length ) {
	        $b = floor( $length / 2 );
		$url = substr( $url, 0, $b )."...".substr( $url, -( $b - 3 ) );
	}
	return $st.$url.'</a>';
}

$urlMaxLength = 20;
$st = "askdaidm [LINK]http://www.asd.it/dwadwadwadwadadwadwadw[/LINK] asdasd";
echo preg_replace( "/(?i)\[link\]([^\a]+?)\[\/link\]/e", "urlLength( \"\\1\", {$urlMaxLength} )", $st );


P.S. eval puo' essere usato direttamente nella preg aggiungendo e in fondo