Еще один прием - защитить все существующие ссылки, кодируя код, затем заменяя URL-адреса ссылками, а затем расшифровывая защищенные ссылки.
$data = 'test http://foo <a href="http://link">LINK</a> test';
$data = preg_replace_callback('/(<a href=".+?<\/a>)/','guard_url',$data);
$data = preg_replace_callback('/(http:\/\/.+?)([ .\\n\\r])/','link_url',$data);
$data = preg_replace_callback('/{{([a-zA-Z0-9+]+?)}}/','unguard_url',$data);
print $data;
function guard_url($arr) { return '{{'.base64_encode($arr[1]).'}}'; }
function unguard_url($arr) { return base64_decode($arr[1]); }
function link_url($arr) { return '<a href="'.$arr[1].'">'.$arr[1].'</a>'.$arr[2]; }
Приведенный выше код является просто доказательством концепции и не обрабатывает все ситуации. Тем не менее, вы можете видеть, что код довольно прост.