Io utilizzerei un pattern di questo tipo
preg_match_all('/<a\s.*?>(.*?)<\a>/',$str,$matches);

Se in $str hai una pagina html. in $matches[1] hai un array di tutti i testi contenuti fra i tag a mentre in matches[0] ti ritrovi un array di tutti i link in formato html