Foros del Web » Programando para Internet » PHP »

Validar caracteres especiales (acentos, etc)

Estas en el tema de Validar caracteres especiales (acentos, etc) en el foro de PHP en Foros del Web. Buenas compañeros. Trabajo con Symfony pero el problema que tengo creo que no tiene nada que ver con esto. Resulta que tengo un textarea y ...
  #1 (permalink)  
Antiguo 08/03/2008, 15:30
 
Fecha de Ingreso: octubre-2007
Mensajes: 7
Antigüedad: 16 años, 6 meses
Puntos: 0
Validar caracteres especiales (acentos, etc)

Buenas compañeros.

Trabajo con Symfony pero el problema que tengo creo que no tiene nada que ver con esto.
Resulta que tengo un textarea y quiero validar el texto introducido por los usuarios para permitir texto y números. Mi aplicación es i18n, por ahora me centro en castellano e inglés pero puedo introducir nuevos idiomas en un futuro.

Estoy probando una expresión regular para validar ese textarea:
Código:
/^\w+$/i
Pero siempre me encuentro con el problema de los acentos, que no me los pasa, ni las ñ's.

Leyendo la documentación de PHP veo que \w valida todas las letras de los diferentes idiomas, segun el locale establecido con setLocale(), creo, así que debería funcionar, pero nada.
No quiero validar los caracteres acentuados uno a uno, porque si más adelante introduzco más idiomas me voy a encontrar con el mismo problema, además que no me parece una solución demasiado correcta.

Como ya estoy de los nervios me he creado un simple archivo php con el siguiente código:
Código:
<?php
echo "before:".(setlocale(LC_ALL, 0))."<br />";
setlocale(LC_ALL, "es_ES.utf-8");
echo "after:".setlocale(LC_ALL, 0)."<br />";

function check($string)
{
  return preg_match("/^\w+$/i",$string);
}

echo check("aáa").'<br />';    // MUST RETURN TRUE 1
echo check("á1").'<br />';     // MUST RETURN FALSE 0
echo check("aaa").'<br />';    // MUST RETURN TRUE 1
echo check("aá3").'<br />';    // MUST RETURN FALSE 0
?>
Y el resultado que obtengo es:
Código:
before:C
after:es_ES.utf-8
0
0
1
0
Osea que ni con un simple archivo me funciona.
He probado usando \d para validar número y si funciona, pero con letras acentuadas nada.
Ni siquiera se si setLocale() tiene algo que ver con mi problema. Estoy venga a leer foros y no encuentro una solución, incluso he leido que tiene que ver con el sistema operativo del servidor... esto es así? Por si ayuda yo trabajo con mi servidor Linux (Ubuntu).

Nada más. Perdón si me he enrrollado demasiado y gracias a todos.
  #2 (permalink)  
Antiguo 08/03/2008, 19:00
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Re: Validar caracteres especiales (acentos, etc)

no se si te ayude pero yo uso lo siguiente. primero hago una varuable de lo que es permitido:

Código PHP:
//caracteres latinos alfanumricos
$permitido "a-zA-ZÁÉÍÓÚáéíóú"
y luego hago un ereg para ver si el usuario ha escrito algo no adecuado:

Código PHP:
if (!ereg("^[ $permitido]{3,}$",$valor_a_validar)) $mensajes .= $error[1]; 
si el valor no tiene por lo menos 3 caracteres o si se encuentra algo que no está en la variable muestro en este caso el error numero 1.

Espero que te sirva.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #3 (permalink)  
Antiguo 09/03/2008, 03:54
 
Fecha de Ingreso: octubre-2007
Mensajes: 7
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Validar caracteres especiales (acentos, etc)

Gracias juan pero eso es algo que quiero evitar porque si luego añado otros idiomas, como el frances, por ejemplo, que es bastante probable, tengo que ir añadiendo los caracteres "extraños" que son válidos en frances, y luego en otros idiomas... buff, sería bastante chapucero el tema.
Y más habiendo un patrón \w que precisamente sirve para eso, lo que no entiendo es porque a mi no me funciona. A ver si alguien lo usa correctamente y me explica como lo hace porque yo ya no entiendo nada.
Si es problema de PHP, que no creo porque estarian los foros llenos de consultas sobre el tema, tendré que hacer algo parecido a lo que comentas, pero esperaré un poco a ver que dicen otros expertos en la materia.

Gracias juaniquillo.
  #4 (permalink)  
Antiguo 09/03/2008, 04:30
 
Fecha de Ingreso: agosto-2004
Ubicación: Lugo
Mensajes: 15
Antigüedad: 19 años, 8 meses
Puntos: 0
Re: Validar caracteres especiales (acentos, etc)

en españa utilizamos el
Cita:
es_ES.ISO8859-1
no el
Cita:
es_ES.utf-8
Creo que ese es tu problema
  #5 (permalink)  
Antiguo 06/06/2011, 01:30
 
Fecha de Ingreso: mayo-2011
Mensajes: 3
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: Re: Validar caracteres especiales (acentos, etc)

Cita:
Iniciado por juaniquillo Ver Mensaje
no se si te ayude pero yo uso lo siguiente. primero hago una varuable de lo que es permitido:

Código PHP:
//caracteres latinos alfanumricos
$permitido "a-zA-ZÁÉÍÓÚáéíóú"
y luego hago un [URL="http://us3.php.net/ereg"]ereg[/URL] para ver si el usuario ha escrito algo no adecuado:

Código PHP:
if (!ereg("^[ $permitido]{3,}$",$valor_a_validar)) $mensajes .= $error[1]; 
si el valor no tiene por lo menos 3 caracteres o si se encuentra algo que no está en la variable muestro en este caso el error numero 1.

Espero que te sirva.
Gracias Juan! A mi si me sirvio mucho tu respuesta! =D
  #6 (permalink)  
Antiguo 20/06/2011, 15:31
Avatar de fitorec  
Fecha de Ingreso: septiembre-2008
Ubicación: Oaxaca Oaxaca
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Validar caracteres especiales (acentos, etc)

Cita:
Iniciado por juaniquillo Ver Mensaje

Código PHP:
//caracteres latinos alfanumricos
$permitido "a-zA-ZÁÉÍÓÚáéíóú"
y luego hago un ereg para ver si el usuario ha escrito algo no adecuado:

Código PHP:
if (!ereg("^[ $permitido]{3,}$",$valor_a_validar)) $mensajes .= $error[1]; 
.

Cita:
Iniciado por mass Ver Mensaje
Gracias juan pero eso es algo que quiero evitar porque... buff, sería bastante chapucero el tema......
Dudo que sea tan chapucero Si Define reglas de validación y un comportamiento en tus modelos/controladores. (supongo que el Symfony te lo permite),al cargar i18n & l10n.

Ahora el ereg funciona pero NO es recomendable, mayor información:

http://php.net/manual/en/function.ereg.php#refsect1-function.ereg-description


Creo lo mejor es definir reglas de validación en expresiones para cada idioma, te dejo un codigo donde agrego otros caracteres que no contempla el \w como la ñ,ü(--si no como escribo pingüino--),comas,puntos, y paréntesis.

Código PHP:
<ul>
<?php
  $text 
='/^[a-z0-9 .,()üÜáéíóúÁÉÍÓÚñÑ]{5,100}$/i';
  
  
$test = array(    'Holá (muÑdo).',
                    
'MundIrijIlLO 01234, av. 2',
                    
'<h1>hola mundo</h1>',
                    
'Guíllerño Ángel',
                    
'Sr. Madriguera','01 999 888 11 22',
                    
'(01)953-111 2233',
                    
'123456',
                    
'<script>someJAvascriptCode</script>'
  
);

  foreach (
$test as $cadena):
    if(
preg_match($text,$cadena))
        echo 
"<li><b>cadena valida</b>{$cadena}</li>\n";
    else
        echo 
'<li><b>cadena invalidad</b>'.htmlspecialchars($cadena)."</li>\n";
    endforeach;
?>
</ul>
Salida:

Código HTML:
<ul>
<li><b>cadena valida</b>Holá (muÑdo).</li>
<li><b>cadena valida</b>MundIrijIlLO 01234, av. 2</li>
<li><b>cadena invalidad</b>&lt;h1&gt;hola mundo&lt;/h1&gt;</li>
<li><b>cadena valida</b>Guíllerño Ángel</li>
<li><b>cadena valida</b>Sr. Madriguera</li>
<li><b>cadena valida</b>01 999 888 11 22</li>
<li><b>cadena invalidad</b>(01)953-111 2233</li>
<li><b>cadena valida</b>123456</li>
<li><b>cadena invalidad</b>&lt;script&gt;someJAvascriptCode&lt;/script&gt;</li>
</ul> 

Última edición por fitorec; 20/06/2011 a las 15:38
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:20.