Comprobar en PHP si una cadena tiene sólo el conjunto de caracteres permitido

  • Por
Hacemos un script para validar una cadena, en la que sólo se permiten apariciones de un reducido juego de caracteres, por dos métodos, con funciones de string y con expresiones regulares.
En algunas ocasiones tenemos que comprobar la validez de una cadena de caracteres para ver si contiene solamente aquellos que consideramos como válidos. Por ejemplo, si tuviéramos que validar un nombre de usuario, podríamos permitir números, letras y ocasionalmente caracteres "-" o "_", pero no otro tipo de caracteres como "+", "@", "&", etc. Además, siendo un nombre de usuario, podemos tener fijados un máximo y mínimo número de caracteres.

Esta es una de las comprobaciones más simples que se pueden hacer en una cadena, pero no por ello menos importante. Veremos en este artículo una manera de realiza esa comprobación usando las funciones de string y también usando expresiones regulares de PHP.

Usando las funciones de tratamiento de string de PHP

Vamos a realizar una función que reciba un string de un nombre de usuario y compruebe si es correcto. Como hemos dicho, la comprobación tendrá dos partes, la primera para ver si la longitud de la cadena está permitida (entre 3 y 20 caracteres) y la segunda para asegurar que los caracteres utilizados están entre los permitidos.

function comprobar_nombre_usuario($nombre_usuario){
   //compruebo que el tamaño del string sea válido.
   if (strlen($nombre_usuario)<3 || strlen($nombre_usuario)>20){
      echo $nombre_usuario . " no es válido<br>";
      return false;
   }

   //compruebo que los caracteres sean los permitidos
   $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
   for ($i=0; $i<strlen($nombre_usuario); $i++){
      if (strpos($permitidos, substr($nombre_usuario,$i,1))===false){
         echo $nombre_usuario . " no es válido<br>";
         return false;
      }
   }
   echo $nombre_usuario . " es válido<br>";
   return true;
}


La primera parte es muy sencilla, simplemente se mira si la longitud de la cadena es menor que 3 o mayor que 5, porque en ese caso el nombre de usuario sería incorrecto. Para la segunda comprobación, de caracteres válidos, hemos definido una variable local a la función que contiene una cadena con todos los caracteres permitidos para el nombre de usuario. Luego, para cada carácter del string que se desea comprobar, veremos si está contenido dentro de la variable local. En el momento que la cadena con el nombre de usuario tenga un carácter que no esté entre los permitidos, diremos que el nombre de usuario es incorrecto.

Si no nos salimos de la función después de todas las comprobaciones realizadas, es que el nombre de usuario es correcto.

Usando expresiones regulares de PHP

Ahora vamos a ver un método distinto para hacer la misma comprobación, en este caso utilizando expresiones regulares de PHP. Las expresiones regulares permiten comparar la cadena con un patrón, para ver si se ajusta o no a ese patrón.

Existe una función de PHP llamada ereg() que recibe el patrón realizado con una expresión regular y un string para ver si se ajusta al patrón. No es el objetivo explicar las expresiones regulares, aunque comentaremos cómo hemos construido el patrón para este ejemplo. La función ereg() devuelve la longitud de la cadena encontrada que corresponde con el patrón y false, si no encuentra coincidencia entre la expresión regular y el string.

Veamos primero la función que hemos creado para verificar la validez del nombre de usuario:

function comprobar_nombre_usuario_expresiones_regulares($nombre_usuario){
   if (ereg("^[a-zA-Z0-9\-_]{3,20}$", $nombre_usuario)) {
      echo "El nombre de usuario $nombre_usuario es correcto<br>";
      return true;
   } else {
       echo "El nombre de usuario $nombre_usuario no es válido<br>";
      return false;
   }
}


Simplemente se ejecuta la función ereg() y se evalúa el resultado devuelto. Si sale por el caso positivo es que era correcto el nombre de usuario. Si ereg() devuelve un resultado que se evalúa negativamente, el usuario era incorrecto.

La dificultad de esta función está en crear la expresión regular que necesitamos para la pasarla a ereg(). En este caso se realizan las dos comprobaciones mencionadas (longitud del nombre de usuario y caracteres permitidos) en un único paso.

Para entender la función necesitamos conocer algunos símbolos especiales de expresiones regulares en PHP:

"^" Significa que la cadena tiene que empezar por ahí. Por ejemplo la expresión "^hola" concordaría con cualquier cadena que empezase por "hola".

[] se utilizan para indicar un carácter entre varios que se pongan entre los corchetes. Por ejemplo ^[xyz] concordaría con cualquier cadena que comenzase por "x", "y" o "z". Dentro de los corchetes, se pueden poner intervalos de varias letras o números. Por ejemplo [a-z] significa cualquier letra minúscula, desde la "a" a la "z". [0-9] es cualquier número del 0 al 9. [a-zA-Z0-9] es cualquier letra, mayúscula o minúscula, y cualquier número.

Si queremos escribir en el patrón un carácter que se utiliza como un código especial de expresiones regulares, como "-" o ".", se tiene que escribir con una contrabarra delante. Por ejemplo "\-" o "\.".

Luego, [a-zA-Z0-9\-_] es cualquier carácter de los permitidos (letras minúsculas y mayúsculas, números, "-" y "_").

{} Las llaves se utilizan para especificar repeticiones de lo que va delante. Por ejemplo [0-9]{4} quiere decir que hay 4 números. a{3,} quiere decir por lo menos 3 repeticiones de "a". [a-zA-Z0-9\-_] {3,20} quiere decir que cualquiera de los caracteres permitidos en nuestros nombres de usuario, repetidos de 3 a 20 veces.

Por último, el carácter "$" significa que la cadena tiene que terminar ahí. Por ejemplo, la expresión regular "adios$" concordaría con cualquier cadena que terminase en "adios".

Nuestra expresión regular: "^[a-zA-Z0-9\-_]{3,20}$" significa que empiece la cadena por cualquier carácter permitido, que se encuentren de 3 a 20 caracteres permitidos y que la cadena termine después de esas repeticiones. Si el nombre de usuario cumple ese patrón, es que es correcto.

Eso es todo. Hemos visto dos formas de hacer lo mismo, aunque con expresiones regulares queda un código más elegante. Espero que también sirva de introducción para los que nunca antes habían trabajado con ellas.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Andrés

03/3/2006
Creo que deberías agregar la ñ y la Ñ dentro de los corchetes de la regexp.

Emilio

26/4/2007
En el caso del primer ejemplo (usando stripos();), lo de meter una función (strlen();) dentro de la condición que controla el bucle no es buena idea. Consume demasiados recursos. Es mejor crear una variable antes y cargarla con la longitud. Acceder a una variable es mucho más rapido que tener que "medir" la cadena una y otra vez.

yanstan

09/5/2009
validacion de campo
hola como estas .,.,soy nuevo enesto de php, estoy creando un formulario pero necesito hacer validaciones de los campos de texto, la explicacion que tu diste me sirvio en cierta parte.,.,te explico.,.,solo quiero introducir letras no valores numericos.,.,si coloco por ejemplo jose lo acepta,,si coloco 125 me dice que no perimite numero peri si por casualidad coloco jose4545 tambien me lo acepta.,.no se que pueod hacer en ese caso

yanstan

09/5/2009
validar campo
alli te coloco.,.,el codigo php para que puedas visualizar me

mrisra

21/1/2010
No me lo explico
Solo una pregunta.
En el codigo "if (strpos($permitidos, substr($nombre_usuario,$i,1))===false)",
¿Porque utilizan === en lugar de ==?
Ya probe el codigo y observé que con == no reconoce el numero 0 a diferencia de que con === que si lo reconoce, pero no me explico el porque de este fenomeno.
Alguien sabe la respuesta?

Santiago

06/11/2010
LA respuesta es a porque el === es:
http://justimho.blogspot.com/2009/10/php-and-great-operator.html

Martin

29/7/2011
Permitir saltos de linea
Hola, comos estas, muy bueno el codigo, me re sirvio... La verdad que es bastante útil y ademas limitas al usuario que no te meta ni javascript ni ningun codigo malicioso...

Pero una duda, yo en mi codigo quiero permitir ademas los saltos de linea, y yo en permitidos pongo:
$permitidos = "
abcdef......";
pero lo mismo no me toma el salto, tmb entre las comillas probe poniendo , \n, <br>, pero no me lo toma.. En la ultima version estable de php, la 5.2.17.. Queria saber como se hace para permitir los saltos de linea..

Estuve buscando en google, pero encontre como eliminar saltos de linea, pero no como reconocerlos.. :/

Gracias!! :D

javi

16/2/2012
php
=== es por si una funcion devuelve true y tu lo compraras con 1 para sque funcione aunq no sean iguales

Alex H

21/3/2012
Agradecimiento
ME SIRVIÓ MUCHO TU PUBLICACIÓN, MUCHAS GRACIAS

felipe213

20/4/2012
sería
$permitidos = "abcdefghijklmnñopqrstuvwxyz
ABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúü";

martin simondi

19/11/2013
caracteres
porque == es condición igual mientras que === es condición identico