Foros del Web » Programando para Internet » PHP »

expresión regular pregmatch

Estas en el tema de expresión regular pregmatch en el foro de PHP en Foros del Web. Buenas. Le estuve dando vueltas para corroborar que se ingresan correctamente números letras, y todo funciona barbaro hasta que quiero agregar caracteres acentuados o ñ. ...
  #1 (permalink)  
Antiguo 16/06/2011, 16:53
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
expresión regular pregmatch

Buenas.

Le estuve dando vueltas para corroborar que se ingresan correctamente números letras, y todo funciona barbaro hasta que quiero agregar caracteres acentuados o ñ.

Leí en manual php esto:

When using accented characters and "ñ" (áéíóúñ), preg_match does not work. It is a charset problem, use utf8_decode/decode to fix.

Y no entiendo si lo que tengo que hacer es cambiar la configuración del servidor o puedo utilizar alguna función para solucionarlo.

En caso de que sea cambiar una configuración cual sería. encontré 5 en infoPHP que dicen charset.

Esto es lo que hago en código PHP
Código PHP:
Ver original
  1. if(preg_match("/^[0-9A-Za-z_ \\-áéíóúÁÉÍÓÚñÑ]{" . $min . "," . $max. "}$/i", $texto)) {.........

Desde ya gracias por su tiempo. Saludos
  #2 (permalink)  
Antiguo 16/06/2011, 19:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: expresión regular pregmatch

Cita:
Iniciado por francap Ver Mensaje
When using accented characters and "ñ" (áéíóúñ), preg_match does not work. It is a charset problem, use utf8_decode/decode to fix.
El que indicó eso no sabe al parecer sobre charset, que al parecer estaba recibiendo los datos en utf8 y el estaba usando otro tipo de charset, porque preg_match no tiene problemas alguno con letras acentuadas ni la ñ.

Podrías postear mejor lo que hayas hecho al momento aparte del preg_match.

@stramin, hay mejores en este foro que yo que dominan expresiones regulares, Hidek1, pateketrueke, etc. Usan a diario, al parecer hasta duermen con una expresión regular escrita a mano, yo creo que hasta se han hecho tatuajes de eso jajaja.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 17/06/2011, 05:21
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Hola, Gracias por su interés. Este es el contexto.

Código Javascript:
Ver original
  1. //----- filtrar_AlfaNum --------------------------------------------------------------------
  2.  // devuelve verdadero si el $texto es cualqueir numero letra guión o guión bajo
  3.  //y la cantidad de caracteres debe estar entre $min y $max
  4.  
  5. function filtrar_AlfaNum($texto, $min, $max){
  6.     if(preg_match("/^[0-9A-Za-z_ \\-áéíóúÁÉÍÓÚñÑ]{" . $min . "," . $max. "}$/i", $texto)) {
  7.         $resultado =  true;
  8.     }else{
  9.         $resultado =  false;
  10.     }
  11.     return $resultado;
  12. }

La función recibe un texto y el valor mínimo y máximo de caracteres que puede tener dicho texto.

La misma expresión regular, es usada en js antes de enviar el mismo texto al servidor y funciona correctamente con regexp de java script.

Estos son todos los valores que nombran al charset info.php:

default_charset no value
HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.3
_SERVER["HTTP_ACCEPT_CHARSET"] ISO-8859-1,utf-8;q=0.7,*;q=0.3
_ENV["HTTP_ACCEPT_CHARSET"] ISO-8859-1,utf-8;q=0.7,*;q=0.3

HTTP_ACCEPT_LANGUAGE es-ES,es;q=0.8
_SERVER["HTTP_ACCEPT_LANGUAGE"] es-ES,es;q=0.8
_ENV["HTTP_ACCEPT_LANGUAGE"] es-ES,es;q=0.8

Muchas gracias a todos. Saludos

Última edición por francap; 17/06/2011 a las 05:31
  #4 (permalink)  
Antiguo 17/06/2011, 06:12
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: expresión regular pregmatch

¿Haz probado la función en otro archivo? Tal vez el problema sea más bien de charset. Posiblemente estás recibiendo un dato de otro tipo de charset y por eso no reconoce las letras con acentos y ñ. Haz un var_dump dentro de la función a la variable $texto para que veas si estás recibiendo correctamente los valores.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 17/06/2011, 07:03
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Ahi va la prueba´

Codigo PHP:
Código PHP:
Ver original
  1. $modelo = $_POST["Modelo"];
  2. $resultado= var_dump($modelo) . "sin dump: " . $modelo; //ingresarArt();
  3.    
  4. echo $resultado;

Estos son los resultados tomados desde js (Ajax responseText)

Mostrados en una div

Con dump: string(14) "ñandú árbol"

sin dump: ñandú árbol

Última edición por francap; 17/06/2011 a las 07:11
  #6 (permalink)  
Antiguo 17/06/2011, 07:41
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: expresión regular pregmatch

Cita:
Iniciado por abimaelrc
@stramin, hay mejores en este foro que yo que dominan expresiones regulares, Hidek1, pateketrueke, etc. Usan a diario, al parecer hasta duermen con una expresión regular escrita a mano, yo creo que hasta se han hecho tatuajes de eso jajaja.
@abimaelrc te dije que era secreto lo del tatuaje u.u!!!

awjuawjaw volviendo al tema podrías usar códigos unicode

Código PHP:
$pattern "/^[\pL\d_]{" $min "," $max"}$/" 
con eso reconocerás acentos ñ y etc..

saludos.


http://cl.php.net/manual/en/regexp.r...ce.unicode.php
__________________
More about me...
~ @rhyudek1
~ Github
  #7 (permalink)  
Antiguo 17/06/2011, 08:44
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

No tampoco reconoce las ñ y acentos, como válidos.
  #8 (permalink)  
Antiguo 17/06/2011, 08:46
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: expresión regular pregmatch

¬¬ te indiqué lo del charset que lo más probable sea eso
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 17/06/2011, 09:27
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Si, hice la prueba con var_dump y me dio estos resultados:

Con dump: string(14) "ñandú árbol"

sin dump: ñandú árbol

Ahora estuve viendo que cuando envío los datos con ajax. seteo el encabezado así

Código Javascript:
Ver original
  1. this.conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

el this es porque cree un objeto. pero no tiene importancia.

Puede ser el problema. Voy a averiguar en el foro de ajax como agrego al header:

content="text/html; charset=iso-8859-1"

a ver si eso lo soluciona.
  #10 (permalink)  
Antiguo 17/06/2011, 09:51
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Hice las pruebas correspondientes y nada

Prueba 1: agregue al heder el charset latino:



Código Javascript:
Ver original
  1. this.conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  2. this.conexion.setRequestHeader("charset", "iso-8859-1");


Nada todo sigue igual.

Prueba 2: Dentro del archivo puse manualmente el texto a verificar

Código PHP:
Ver original
  1. function filtrar_AlfaNum($texto, $min, $max){
  2.     if(preg_match("/^[0-9A-Za-z_ \\-áéíóúÁÉÍÓÚñÑ]{" . $min . "," . $max. "}$/i", $texto)) {
  3.         $resultado =  true;
  4.     }else{
  5.         $resultado =  false;
  6.     }
  7.     return $resultado;
  8. }
  9.  
  10. $modelo = $_POST["Modelo"];
  11.  
  12. $modelo = "ñandú árbol"; // evitamos los datos post
  13. $resultado= filtrar_AlfaNum($modelo , 1, 20)

Nada lo toma como no valido

Última edición por francap; 17/06/2011 a las 09:59
  #11 (permalink)  
Antiguo 17/06/2011, 10:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: expresión regular pregmatch

Haz una prueba más sencilla, desde un archivo PHP aparte
Código PHP:
Ver original
  1. <?php
  2. function filtrar_AlfaNum($texto, $min, $max){
  3.     return preg_match("/^[\pL\d_ ]{" . $min . "," . $max. "}$/i", $texto)
  4.         ? true
  5.         : false;
  6. }
  7. $modelo = "ñandú árbol";
  8. var_dump(filtrar_AlfaNum($modelo , 1, 20)); // bool(true)
  9. $modelo = "ñandú árbol)(";
  10. var_dump(filtrar_AlfaNum($modelo , 1, 20)); // bool(false)
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 17/06/2011, 10:20
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Bien, y como lo resuelvo

Código Navegador:
Ver original
  #13 (permalink)  
Antiguo 17/06/2011, 10:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: expresión regular pregmatch

Ya te lo he indicado varias veces, el problema es de charset. Lo más probable que se haga alguna modificación desde javascript. ¿qué es lo que recomiendo? Todo, todo pero todo, creo que se me olvidaba decir TODO, debe estar UTF-8: Archivo, header, meta, base de datos, etc. Cuando me refiero a archivo no me refiero a que le coloques eso al archivo, sino que cuando grabes el archivo debes hacerlo guardandolo con codificación utf-8. Con Notepad++ puedes cambiarlo a utf8 sin bom.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #14 (permalink)  
Antiguo 17/06/2011, 11:08
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: expresión regular pregmatch

Bueno...
Cambie todo UTF-8 heder html, js la BD no la toque porque hasta acá no hace nada.

Uso dreamweber y esta configurado para crear los nuevos archivos en UTF-8, por lo que supongo que todos están codificados en UTF-8. No se si hay una manera de corroborar esto.

Y no funciona. Gracias por tu ayuda. Se que el problema está ahí. Por ahora voy a dejar que js corrobore los datos, que lo hace bien, y más adelante veré como corroboralo en PHP. Tal vez una función más manual sin expresiones regulares.

Denuevo gracias por tu tiempo.
  #15 (permalink)  
Antiguo 17/06/2011, 18:53
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 14 años, 3 meses
Puntos: 3
De acuerdo Respuesta: expresión regular pregmatch

No pude con mi genio... y después de leer algunos tutoriales que encontré. Entendí con un poco más de claridad lo que me decías.

Bueno en DreamWeber en la ventana de código abajo sobre la derecha, te informa el tipo de archivo que está abierto.

En mi caso el problema es que cambie la versión de dw de la 8 a la cs3 la anterior se ve que tenía configurado crear los archivos como Latin 1 y el cs3 como utf-8.

Así que tenía algunos archivos con un formato y otros con otro. de ahí el error de charset que me decias abimaelrc

Así que con paciencia y saliva abrí uno por uno todos los archivos cree uno nuevo utf-8 copie, pegue y guarde. 105 archivos según fileZilla.

Las 2 o 3 pruebas que hice han funcionado. Supongo que no va a haber otro problema.

Así que gracias por ayudarme a resolver el problema, y por todo lo que he aprendido hoy

Etiquetas: regular
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 22:37.