Tengo la siguiente función para reemplazar un keyword por un elance cuando se encuentre en un texto. Todo funciona perfecto salvo dos excepciones, ambas relacionadas con caracteres especiales como á, é, ñ, etc.
Código:
Por ejemplo, si ejecuto esta función con $keys:function ($keys,$text) { $keys=explode("\n", $keywords); foreach ($keys as $key) { $pat='/([\w\W]*?)\|([\w\W]*)/'; if(preg_match_all($pat,$key,$matches,PREG_SET_ORDER)) { foreach ($matches as $match) { $link=$match[2]; $keyword=$match[1]; $replace='<a href="'.$link.'" title="'.$keyword.'">'.$keyword.'</a>'; $case="i"; $regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. $keyword .'\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'s'. $case; $text = preg_replace($regEx,$replace,$text,1); } } } }
Código:
Índice no es reemplazado nunca, no funciona si la primera letra lleva tilde o es ñ, aunque sí funciona si la tilde o la ñ está en medio de la palabra.$keys = "ATR|http:://www.unenlace.com\nÍndice|http://wwww.otroenlace.com";
Con la palabra ATR todo funciona perfectamente aunque con algunos detalles, si en el texto está la palabra "atrás" es reemplazada por "ATRás" (con el enlace), esto no ocurre si escribo "atras" (sin tilde).
He buscado en internet cosas de preg_replace y problemas que tiene con UTF-8 pero no logro arreglar esto. (he probado con el modificador "u" y no funciona, el archivo donde está el script está en UTF-8 y la base de datos de donde saco el texto a pasar a la función también está en UTF-8).