str_replace не внутри ссылок
if(!preg_match_all("|<a.* href=(.*)>(.*)".$word."(.*)</a>|U",$text,$out)){ }
http://phpclub.ru/talk/threads/Замена-слов-ссылками-с-игнорированием-замены-внутри-ссылки.59457/
Полный текст примера из источника:
//Функция замены по маске function GlossaryFilter($text){ //Прочли файл $glossfile=@file($_SERVER['DOCUMENT_ROOT']."/cache/glossary.txt"); foreach($glossfile as $mask_word){ $token=explode("|",$mask_word); //Если найдено слово из списка if(stristr(trim($text),$token[0])){ //Проверка присутствие ключевого слова внутри ссылки if(!preg_match_all("|<a.* href=(.*)>(.*)".$token[0]."(.*)</a>|U",$text,$out)){ //Заменяем его на ссылку $text=str_replace($token[0],"<a href=\"".trim($token[1])."\" target=\"_blank\">".$token[0]."</a>",$text); } } } //Вернули текст return $text; }