Как насчет этого, учитывая, что вы, возможно, захотите повторно использовать его с другими href
s:
$str = '<a href="link.html">text</a>';
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str);
var_dump($result);
Что вам даст:
string '<a href="link.html"></a>' (length=24)
(я полагаю, вы сделали опечатку в ОП?)
Если вам не нужно сопоставлять какие-либо другие ссылки, вы можете использовать что-то вроде:
$str = '<a href="link.html">text</a>';
$result = preg_replace('#(<a href="link.html">).*?(</a>)#', '$1$2', $str);
var_dump($result);
Что также даст вам:
string '<a href="link.html"></a>' (length=24)
В качестве пояснения: для более сложного HTML не пытайтесь использовать регулярные выражения: они отлично работают в такой простой ситуации, но для реальной части HTML они не очень помогают, в общем: HTML не вполне "регулярно" "достаточно" для анализа регулярными выражениями.