Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] REGEXP PHP y MySQL (acentos y ñ)

Estas en el tema de REGEXP PHP y MySQL (acentos y ñ) en el foro de PHP en Foros del Web. Hola, con ese fin estoy usando esto, pero a veces se "enciman"... o algo así, mejor les enseño: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $keyword ...
  #1 (permalink)  
Antiguo 12/04/2016, 21:16
Avatar de jrggrz  
Fecha de Ingreso: febrero-2002
Ubicación: Del valle DF México
Mensajes: 60
Antigüedad: 22 años, 2 meses
Puntos: 0
REGEXP PHP y MySQL (acentos y ñ)

Hola, con ese fin estoy usando esto, pero a veces se "enciman"... o algo así, mejor les enseño:
Código PHP:
Ver original
  1. $keyword ="palabra";
  2.  
  3. $que = array (
  4.     'a','e','i','o','u',
  5.     'á','é','í','ó','ú',
  6.     'ñ','Ñ','n','N');
  7. $por = array (
  8.     '[á|a]','[é|e]','[í|i]','[ó|o]','[ú|u]',
  9.     '[a|á]','[e|é]','[i|í]','[o|ó]','[u|ú]',
  10.     '[ñ|n]','[Ñ|N]','[n|ñ]','[N|Ñ]');
  11.  
  12. $keyword = str_replace($que,$por,$keyword);

y en la $keyword pasa dos veces las vocales... sale esto:

Código:
SELECT * FROM tabla WHERE columna RLIKE 'p[[á|a]|a]l[[á|a]|a]br[[á|a]|a]'
y MySQL genera resultados que ni al caso, el 80% de los registros dan positivo, ya cambié el orden, la forma.... ¿sí es str_replace() la función adecuada? al parecer evalúa y vuelve a reemplazar la parte de la cadena que ya había procesado, pero la única forma que encontré de evitarlo fue eliminando la segunda línea de vocales "'á','é','í','ó','ú'," del array, solo que así ya no funciona en ambos sentidos, y sí hay quienes escriben los acentos en el campo de búsqueda. ¿alguien sabrá qué estoy haciendo mal, o me sugieren procesar la cadena de otro modo?
__________________
Jorge Garza


GTM.mx
  #2 (permalink)  
Antiguo 12/04/2016, 21:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: REGEXP PHP y MySQL (acentos y ñ)

OFF TOPIC en MySQL.

Las soluciones por programación en PHP son tema del foro de PHP.

Movido a PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/04/2016, 22:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: REGEXP PHP y MySQL (acentos y ñ)

El tema es que también reemplazas las vocales acentuadas, y efectivamente ese es el problema.

Lo mejor es que recorras la cadena letra a letra y reconstruyas la expresión regular.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 13/04/2016, 04:39
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: REGEXP PHP y MySQL (acentos y ñ)

El problema es que str_replace está usando, para el reemplazo n, la salida del reemplazo n-1.La cadena
sobre la que se reemplaza [e|é] no es la misma que la que se usa al reemplazar [a|á]
Código PHP:
Ver original
  1. echo preg_replace_callback("/[aáeéiíoóuú]/",function($match){
  2.    
  3.     switch($match[0])
  4.     {
  5.         case "a":
  6.             case "á":{
  7.                 return "[a|á]";
  8.             }break;
  9.     }
  10.    
  11. },"palabra");
Hay que añadir el resto de los cases del switch.
  #5 (permalink)  
Antiguo 13/04/2016, 08:21
Avatar de jrggrz  
Fecha de Ingreso: febrero-2002
Ubicación: Del valle DF México
Mensajes: 60
Antigüedad: 22 años, 2 meses
Puntos: 0
Respuesta: REGEXP PHP y MySQL (acentos y ñ)

Gracias, quedó resuelto. =))
__________________
Jorge Garza


GTM.mx
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:18.