Foros del Web » Programando para Internet » PHP »

Problema con la funcion preg_replace_callback

Estas en el tema de Problema con la funcion preg_replace_callback en el foro de PHP en Foros del Web. Hola, Estoy tratando de realizar un glosario de terminos utilizando php y mysql. Entonces, tengo textos en los cuales quiero que se reemplace automaticamente las ...
  #1 (permalink)  
Antiguo 19/08/2009, 05:19
 
Fecha de Ingreso: enero-2009
Mensajes: 19
Antigüedad: 15 años, 3 meses
Puntos: 0
Problema con la funcion preg_replace_callback

Hola,

Estoy tratando de realizar un glosario de terminos utilizando php y mysql.

Entonces, tengo textos en los cuales quiero que se reemplace automaticamente las palabras que pertenecen al glosario con un enlace.

Al principio, utilizaba la funcion str_replace pero el problema era cuando la palabra estaba por ejemplo al singular en el glosario y si estaba al plural el los textos. O tambien si pasaria el caso de tener una palabra como mente en el glosario y estupendamente en el texto.

Entonces, investigue y descubrí la funcion preg_replace_callback. Todo lo que pretendia funcionaba(palabras al plural) pero ahora me encuentro con un problema si las palabras estan acentuadas.

La utilizo de la siguiente manera:

Código:
function remplace($matches){
	$enlace = '<a href="glosario.php" title="Leer la definición">'.$matches[0].'</a>';
	return $enlace;
}
$cadena_inicial="Ca&iacute; del tejado";
$termino="Ca&iacute;";
$cadena_inicial = preg_replace_callback('/\b'.$termino.'+(?:|s|es)\b/i','remplace', $cadena_inicial);
echo $cadena_inicial;
Si cambio la variable &termino por tejado, funciona perfectamente.
Tambien es curioso porque si tenemos:
$cadena_inicial="Ca&iacute;a del tejado";
$termino="Ca&iacute;a";

Entonces, ahi funciona perfectamente.

He mirado el tema de la expresion regular '/\b' y \b/i' pero la verdad es que no lo entiendo mucho. Agradeceria si alguien pudiese ayudarme a resolver el problema y tambien darme algun link interesante para documentarme sobre las expresiones regulares.

Gracias.

Saludos
  #2 (permalink)  
Antiguo 19/08/2009, 05:38
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

http://www.regular-expressions.info/quickstart.html
  #3 (permalink)  
Antiguo 19/08/2009, 05:53
 
Fecha de Ingreso: enero-2009
Mensajes: 19
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

Hola,

Y el problema que hay al tener caracteres acentuados es debido a la expresion regular establecida en al funcion o a otra cosa?
  #4 (permalink)  
Antiguo 19/08/2009, 06:36
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

el \b final no te va a funcionar ya que solo coincide con las letras sin acentuar, tenes que usar \B

por otro lado me parece que el + está de más

yo la usaría asi:

/\B'.$termino.'(?:|s|es)\B/i

edit: la primer \B también mayuscula, x si te toca una palabra acentuada en la primer letra..

Última edición por horape; 19/08/2009 a las 06:54
  #5 (permalink)  
Antiguo 19/08/2009, 07:01
 
Fecha de Ingreso: enero-2009
Mensajes: 19
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

Ok,

he probado como me comentas pero despues no iban las no acentuadas, entonces, le pusé lo siguiente:

'/\b'.$termino.'(?:|s|es)(\B|\b)/i'

Y ahora si funciona pero ahora no me contempla si la palabra esta al plural.

Mas concretamente si tengo:

Código:
$cadena_inicial="Ca&iacute; del tejados";
$termino="tejado";
$cadena_inicial = preg_replace_callback('/\b'.$termino.'(?:|s|es)(\B|\b)/i','remplace', $cadena_inicial);
Ahora, solo me cambia tejado y me deja la 's' fuera del enlace.

Tambien te queria preguntar para que sirve la /i.

Saludos
  #6 (permalink)  
Antiguo 19/08/2009, 07:10
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

tenes razon

/(\B|\b)'.$termino.'(?:|s|es)(\B|\b)/i

pero esa si me anda, con plural y todo

la i es un modificador que indica que tome tanto mayusculas como minusculas, o sea Cai y cai

la / inicial y final indica donde comienza y termina el patrón, hay que usarlo siempre

igual poner \b|\B es lo mismo q nada, xq uno es la negacion del otro.. deberias hacerlo a mano, por ej poner (?='"-:,\.\s) (si es que es un texto normal, es decir sin caracteres raros como los caracteres de control) o algo asi, o negar [^\w] y agregarle los acentos, total las vocales son 5 nomas =)

te recomiendo q leas esa guia q t pase, asi te armas tu patrón a gusto

Última edición por horape; 19/08/2009 a las 07:26
  #7 (permalink)  
Antiguo 19/08/2009, 07:34
 
Fecha de Ingreso: enero-2009
Mensajes: 19
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

De esta manera, no me van los plurales:

/(\B|\b)'.$termino.'(?:|s|es)(\B|\b)/i

Quitando (\B|\b) de los 2 lados, lo cambia pero deja igual la s fuera del enlace.

las unicas formas para que me vaya la s dentro del enlace es la siguiente;

'/(\b|\B)'.$termino.'(?:|s|es)\b/i' o tambien '/'.$termino.'(?:|s|es)\b/i'

pero asi, vuelvo a lo mismo con lo de los acentos

Para probar tengo estes 2 ejemplos:

ejemplo 1: ( ahi no van los plurales)

Código:
$cadena_inicial="Ca&iacute; del tejados";
$termino1="Ca&iacute;";
$termino2="tejado";
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino1.'(?:|s|es)(\b|\B)/i','remplace', $cadena_inicial);
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino2.'(?:|s|es)(\b|\B)/i','remplace', $cadena_inicial);
ejemplo 2: (ahi van los plurales pero no van las que acaban acentuadas)

Código:
$cadena_inicial="Ca&iacute; del tejados";
$termino1="Ca&iacute;";
$termino2="tejado";
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino1.'(?:|s|es)\b/i','remplace', $cadena_inicial);
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino2.'(?:|s|es)\b/i','remplace', $cadena_inicial);
Asi a todo voy a estudiar el enlace que me pasaste. La verdad que el tema este es bantante complejo.
  #8 (permalink)  
Antiguo 19/08/2009, 07:59
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

Cita:
Iniciado por Oli_ar Ver Mensaje
De esta manera, no me van los plurales:

/(\B|\b)'.$termino.'(?:|s|es)(\B|\b)/i

Quitando (\B|\b) de los 2 lados, lo cambia pero deja igual la s fuera del enlace.

las unicas formas para que me vaya la s dentro del enlace es la siguiente;

'/(\b|\B)'.$termino.'(?:|s|es)\b/i' o tambien '/'.$termino.'(?:|s|es)\b/i'

pero asi, vuelvo a lo mismo con lo de los acentos

Para probar tengo estes 2 ejemplos:

ejemplo 1: ( ahi no van los plurales)

Código:
$cadena_inicial="Ca&iacute; del tejados";
$termino1="Ca&iacute;";
$termino2="tejado";
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino1.'(?:|s|es)(\b|\B)/i','remplace', $cadena_inicial);
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino2.'(?:|s|es)(\b|\B)/i','remplace', $cadena_inicial);
ejemplo 2: (ahi van los plurales pero no van las que acaban acentuadas)

Código:
$cadena_inicial="Ca&iacute; del tejados";
$termino1="Ca&iacute;";
$termino2="tejado";
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino1.'(?:|s|es)\b/i','remplace', $cadena_inicial);
$cadena_inicial = preg_replace_callback('/(\b|\B)'.$termino2.'(?:|s|es)\b/i','remplace', $cadena_inicial);
Asi a todo voy a estudiar el enlace que me pasaste. La verdad que el tema este es bantante complejo.
ahh vos querias la s dentro del enlace!! yo pensaba q no

entonces saca el signo afuera, así (:|s|es)?
  #9 (permalink)  
Antiguo 19/08/2009, 08:11
 
Fecha de Ingreso: enero-2009
Mensajes: 19
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

Claro asi va perfectamente.

Miré en la guia y dicen la letra que esta delante del interogante es opcional entonces, el conjunto de letras seria opcional.

Muchas gracias por tu ayuda.

Finalmente, dejo aqui la solucion definitiva:

'/'.$termino.'(s|es)?/i'

Saludos.
  #10 (permalink)  
Antiguo 19/08/2009, 08:11
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con la funcion preg_replace_callback

igual no t olvides de reemplazar los \b|\B porque sino te va a atrapar tambien palabras que incluyan tu palabra, como "paracaidas" (bueno no lleva acento pero se entiende)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:53.