Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/10/2011, 13:47
cyberpasta
 
Fecha de Ingreso: marzo-2007
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
preg_replace con caracteres especiales

Saludos gente!!!

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:
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);
    }
   }
}
}
Por ejemplo, si ejecuto esta función con $keys:

Código:
$keys = "ATR|http:://www.unenlace.com\nÍndice|http://wwww.otroenlace.com";
Í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.

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).