Estás mirando la versión 3 de mi sitio web, para ver la última versión por favor anda a juque.cl

juque

Juan Pablo Aqueveque: Ingeniero de Sistemas, Diseñador y Desarrollador Web que reside en Temuco, Chile.

PHP: Sólo números y una letra

Publicado por Juan Pablo el 16.Jun.2006 | Comentarios (16)

Una de las cosas que diferencia a un desarrollador mediocre de uno profesional son las validaciones; sin duda son la parte más tediosa de un desarrollo. Navegando por ahí cada vez que me enfrento a cualquier formulario no me resisto a hacer un "enviar" sin completar ningún campo, a ver que tan bueno es el desarrollador: a veces es bueno, a veces es pésimo y otras veces excepcional.

Aquí hay una expresión regular que elimina cualquier tipo de caracter menos números y una letra en particular:

$s = "Kkasdfasd45t4&//((/)\"#$#$%#k$%#$%1234abc\n";
$s = preg_replace("/[^k0-9]/i","",$s);
echo $s;
// resultado
Kk454k1234

Si son Chilenos podrán reconocer el resultado, es la validación inicial para un RUT, filtrará cualquier tipo de caracter menos un número y la letra "k".

Enlace Permanente, Comentarios (16), Publicada en: Código | PHP

Comentarios

1. Hermann
16.Jun.2006

¿Por qué [^k-k0-9]? Debería ser suficiente con poner [^k0-9].

Jeje, yo uso expresiones regulares para todas las validaciones de formularios :-P

2. juan pablo
16.Jun.2006

Hola Hermann: ¿Me puedes creer que siempre la he usado así?, bueno la primera vez y nunca me detuve a probar más simplificadamente, muchas gracias.

3. Nelson Rodríguez-Peña
16.Jun.2006

De hecho, creo que inicialmente deberías aceptar como válido k, 0-9, puntos (.,), espacios y guiones (-_) al menos. Eso indica que el usuario ha ingresado el dato sin importar el formato en que lo haya hecho, y que contiene los ingredientes necesarios. No es bueno forzar al usuario a usar un sólo formato. Posteriormente, podrás eliminar todo, menos [k0-9] y pasar el string al validador de RUT.

4. juan pablo
16.Jun.2006

Hola Nelson: ¡Esa es la idea!. Que el usuario ingrese el rut como le vanga la gana. Pero el ingeniero sólo necesita "números" y la "K" para decir true o false.

5. Ricardo Aroca
16.Jun.2006

Concuerdo con Nelson en que no se debe forzar al usuario, sino que es el software el que debe adaptarse al usuario, en la medida de lo posible. Después de todo, se trata de hacer la vida más fácil al usuario. En el caso del rut 11.111.111-k debiera ser procesado igual que 11111111-k. Esto implica trabajo extra, pero teniendo una buena biblioteca de validadores (javascript, php) se aligera la carga. Del dicho al hecho ...

6. judas
17.Jun.2006

MMM.. juque.. esta vez discrepamos barbaramente.

Del punto de vista del usuario podria ser, pero esto es un muy mala idea desde el punto de vista del desarrollo de software. es demasiado propenso a caer un anti patrones como el denominado "Input Kludge"[1], dificultando mucho la etapas de prueba.

En resumen, yo los invito a mantenerse lo mas lejos posible de esta técnica , si despues te encuentras con cualquier barbaridad en tu base de datos , no digas que no te lo adverti :P

Finalmente, para este caso específico, lo que necesitas es que el usuario te provea de un RUT valido, el eliminarle partes a la cadena de texto para que "parezca a un rut", no te sirve para obtener el resultado esperado y tendras que pasar el dato por una segunda función..

En lugar de utilizar el metodo propuesto, seria mejor pensar si de verdad necesitamos el RUT en el formulario y, recien ahí, utilizamos una función que retorne valor booleano para luego indicarle al $USER si su informacion es correcta o no.

[1]http://en.wikipedia.org/wiki/Input_kludge

7. Erwin Ried
17.Jun.2006

A mi parecer sería más elegante buscar una secuencia como:

[0-9]{7,8}[k|K|0-9]

Que limpiar una cadena para ver lo que queda sobrante y procesarlo.

8. juan pablo
17.Jun.2006

@judas: Tengo la sensación de que hay un tremendo mal entendido en mi Entrada. Lo que he compartido es la VALIDACIÓN INICIAL de un rut. Falta aún la segunda parte.

Supongamos que debemos validar un rut, el pseudocódigo de una entrada de rut sería (en mi humilde opinión) así:

Si el campo es vacío mostrar error. Si el campo no es vacío limpiarlo, aceptar sólo números y la K (lo que he posteado). Validar de acuerdo al módulo 11 si el campo ingresado es un rut. Si lo es, devolver un verdadero. De lo contrario, devolver un falso.

Judas: ¿Tan equivocado estoy?, te insisto, tengo la sensación de que no me entendiste.

9. judas
17.Jun.2006

Su logica es correcta estimado juque, pero su procedmiento en PHP en mi opinion no. para que quieres una validacion inicial si el algoritmo final para validar el RUT[1] te va deberia devolver FALSE si le pasas cualquier cosa que no sea un RUT (???)

Ahora si de verdad quieres aceptar solo numeros y K, para que el usuario no se equivoque, entonces pongale un javascript al formulario, no derive al servidor el trabajo que puede hacer el cliente ;-)

Solo a partir del tercer punto seguido de tu pseudocodigo lo pasas al PHP, porque ahi recien, tiene que discernir si el dato es valido, porque va a ser ingresado a tu DB u otro lugar, donde la informacion debe ser correcta.

De estas cosas siempre discuto con los diseñadores web, jejej :) , el unico que me aguanta es huinca :) y eso es porque tiene hartos sistemas de millones de lineas de codigo PHP encima y para entender lo complicado que se pone con el tiempo.. ;-)

Mutilar la cadena con un proposito de validacion sige siendo do una mala idea en mi opinion personal.

[1] http://foro.php5.cl/viewtopic.php?id=42

10. juan pablo
17.Jun.2006

Ahora entiendo tu punto. Gracias, por un minuto pensé en cambiar de rubro. Bueno, el motivo de mi validación por parte es darle la mejor información al usuario cuando éste se equivoca. Un sistema que entregue un ambiguo mensaje del tipo "ocurrió un error" no me gusta, no me sirve y me confunde (hablando como usuario). Validar por partes puede ser largo, son más if's o else's, pero el beneficiado es mi usuario, es decir, lo hago por una razón de usabilidad.

¿Usar Javascript?, ¡perfecto!, pero mis sistemas deben funcionar con Javascript, como sin él.

Pensando en nuestro problema inicial, ¿Cuál es el objetivo final de un desarrollo?:

1. ¿que tu código sea súper comprimido, eficiente y eficaz, pensando en un Oscar Developer Award, o

2. que el usuario tenga la mayor cantidad de información de los errores que él cometío en la interacción con el sistema?.

Personalmente mi prioridad es la 2, para luego hacer mi código lo más elegante posible.

11. Huinca
18.Jun.2006

Primero aclaro que vengo de ultratumba a dar mi opinión ya que me la solicitaron, pero desde algunos meses estoy retirado por estudios y la falta de manos a la obra le resta valor a lo que pueda decir acá.

Entrando en materia, creo que una opción válida es combinar javascript y PHP, es muy poco el trabajo extra y cuando tienes tus bibliotecas listas ya se hace hábito hacerlo compatible. Además, creo que se les está olvidando que la herramienta prima es el HTML, el Sr. Usuario no verá javascript ni PHP ni mucho menos bases de datos, Dios lo libre. Así, la primera validación debería ser apelar a la inteligencia del Sr. U con una instrucción de una línea que contenga un ejemplo: "Ingrese su RUT (ej. 12.345.678-k)". Por favor no utilizar límites a la cantidad de caracteres como en https://www.bancochile.cl/cgi-bin/navega?pagina=ingresobae , al escribir "12.345.678" ya no se puede completar el resto y no todos sabrán que hay que omitir puntos y rayas.

El punto siguiente que podría haber y casi nunca se ve es una corrección en vivo del RUT para pasar a un formato homogéneo: las cadenas "12345678k", "12345678-k", "12345.678k", etc. podrían ser sintácticamente traducidas a la canónica "12.345.678-k" y así PHP validará sólo un formato (dejando tranquilo de paso a judas, que en mi opinión no está tan lejos pero visto del punto de vista del sistema). Un ejemplo de esto lo tiene http://www.bancoestado.cl/personas/ donde el formato se ajusta a una sintaxis humanamente entendible y computacionalmente predecible.

Y algo que ojalá no vea muy a menudo es lo que se encuentra en http://www.fondosdecultura.cl/ , el formato para ingresar el RUT no es predecible en absoluto a menos que pinches un signo "?" y, si tienes capacidades para AJAX, aparece una ayuda donde al final te explica el formato que algún ingeniero perezoso definió para que el guión separe el rut del dígito verificador sin preocuparse de puntos, espacios y otros caracteres que se cuelan al digitar.

Como la entrada es de PHP, dejo un código para meditar:

$DigitoVerificador = "0";
if ( empty($DigitoVerificador) ) {
  echo 'Ingrese Dígito Verificador';
  echo 'Pero el cero (0) es considerado vacío aunque sea un RUT válido :)';
}
12. judas
18.Jun.2006

@juanpablo

Lo que yo espero de mi codigo es que sea mantenible a traves del tiempo, seguro, ordenado, estructurado y que no caiga en los comportamientos impredecibles que puede producir "mutilar" una informacion para darle una pista al usuario de lo que esta mal. logicamente tambien espero que el que diseña la interfaz de usuario (que no soy yo :D) utilize todas las tecnologias disponibles en los browsers modernos para hacer placentera la experiencia del usuario ;-)

13. 0x01
18.Jun.2006

@judas, caiste en el error comun de todos los desarrolladores:

logicamente tambien espero que el que diseña la interfaz de usuario (que no soy yo :D)

Yo como desarrollador y futuro ingeniero, deberia ser el principal cooperador con el diseño de interfaz.

Saludos y buen articulo Juque :)

14. Gustavo Castro
27.Jun.2006

Bueno amiguitos la verdad he usado esta funcion en un nivel inferior no dandole tanta importancia de momento pues mi necesidad era simplemente limpiar el nombre de una variable para usarla como nombre visible por el usuario y la verdad con respecto al tema de si se debe o no ser "mediocre" al momento de formar un formulario me parece que una salida prudente a esta discusion es javascript que nos permite hacer interactivo el formulario antes de enviarlo y asi de todas formas podriamos instruir a los usuarios finales, ya sea para que ellos verifiquen y decidan o sea para impedirles que envien caracteres que de verdad no se necesiten por otra parte si me regalas el css y lo de los cambios de colores de esta pagina me sentire honrrado tambien gracias amigito. ps: disculpen la ortografia

15. Ricardo C.
10.Jul.2006

Puedo usar javascript con php, combinarlos; es decir manejar codigo Javascript y dentro de este codigo php o viceversa?

16. juan pablo
10.Jul.2006

Javascript se ejecuta en el lado del Cliente, PHP en el lado del servidor. No puedes mezclarlos, pero aún así puedes usar el lenguaje de marcas JSON para construir una especie de pasarela, muy usada con AJAX. Mira este ejemplo: Preload Data with AJAX and JSON