$str = preg_replace("~(".implode("|" , array_map(function($a){
return preg_quote($a,"~");
},$words)).")~i" , "<strong>$1</strong>" , $str);
Вы можете попробовать
$str = preg_replace("~(".implode("|" , array_map(function($a){
return '\b'.preg_quote($a,"~").'\b';
},$words)).")~i" , "<strong>$1</strong>" , $str);
чтобы указать, что оно должно быть full word