Respuesta: Cansao de buscar algo para validar CIF, (Ayuda) Código:
if (preg_match('/@hotmail/', $email)) {
// etc...
}
Los corchetes ([ ]) son caracteres especiales dentro de un patron, y se utilizan para indicar que en dicha posicion se matchea cualquiera de los caracteres dentro de los corchetes. Por ejemplo:
Código:
if (preg_match('/PHP[45]/', $version)) {
...etc..
}
A este tipo de patrones se los llama "clases de caracteres".
Podemos definir una clase de caracteres usando un rango de caracteres, por ejemplo: [a-z], [0-9], [A-Za-z]. Al usar el caracter - dentro de la clase le estamos indicando que incluya en la clase todos los caracteres que estan entre el caracter a la derecha y el caracter a la izquierda. Notese que los caracteres se ordenan segun el estandar ASCII, asi que el rango [A-z] va a contener mas caracteres de los que pensamos.
Ademas podemos indicar que una clase de caracteres son todos los caracteres menos los indicados en la lista poniendo el caracter ^ justo despues del corchete, por ejemplo: [^a] matchea cualquiera caracter salvo el caracter "a", [^0-9] matchea cualquiera caracter no numerico.
Ademas existen algunas clases predefinidas, por ejemplo el caracter "." (punto), que matchea todos los caracteres salvo el salto de linea (se puede hacer que el . matchee tambien el salto de linea usando el modificador "s").
Otros clases especiales:
\d - Matchea todos los numeros
\D - Matchea todos los caracteres que no sean numeros
\w - Matchea todos los caracteres que puedan formar una palabra (el alfabeto, los numeros y el guion bajo, y dependiendo de la configuracion las letras con acentos)
\W - Matchea los caracteres que no pertenecen a \w
\s - Matches todos los caracteres que representen un espacio vacio
\S - Matchea los caracteres que no pertenecen a \s
Podemos armar patrones que indiquen la repeticion de un cierto caracter o patron, por ejemplo, podemos armar un patron para determinar si un texto representa un entero positivo si en este definimos una repeticion de los digitos decimales, o sea, varias veces un numero entre el 0 y el 9.
Veamos como hacer algo de este estilo. Para esto se utilizan los caracteres especiales * + y ?.
El caracter * indica que el caracter o patron anterior a este caracter puede aparecer infinita cantidad de veces o ninguna ves. Por ejemplo el patron "a*" matchea con "" (la cadena vacia), "a", "aa", "aaa", etc....
El caracter + indica 1 o mas repeticiones, o sea que "a+" matchea con "a", "aa", "aaa", pero no con "".
El caracter ? indica 1 aparicion o ninguna, o sea que "a?" matchea con "" y "a", pero no con "aa", "aaa", etc...
Podemos usar estos caracteres para repetir un caracter cualquiera, una clase de caracteres ( [a-z]* , \s+ , .* ), o un subpatron (que vamos a ver dentro de poco).
Con este en mente podemos armar un patron que matchee con numeros enteros:
/[0-9]+/
pero tal vez este patron no nos de el resultado que quisieramos al usarlo con preg_match ya que este patron va a matchear con cualquier texto que tenga al menos un caracter numerico. Mas adelante vamos a ver como armar el patron para que matchee unicamente si lo hace con todo el texto donde estamos aplicando la expresion regular (cuando veamos assertions simples).
----
Existe otra manera mas flexible de indicar repeticion, en la cual podemos indicar exactamente cuantas veces aparece el patron repetido. Para esto se usa la notacion "{min,max}", por ejemplo "a{2,4}" matchea solo con "aa", "aaa"y "aaaa". Si no explicitamos el maximo se considera que puede haber infinitas repeticiones, entonces el "*" tambien se puede escribir "{0,}", y el "+" se puede escribir "{1,}".
Si solo queremos que cierto patron se repita cierta cantidad de veces usamos la notacion "{cant}", por ejemplo, "a{3}" matchea solo con "aaa".
Los "assertions" (no conozco un termino en español) sirven para determinar entre que elementos se encuentra un patron, o sea, por defualt un patron puede matchear en cualquier lado del texto que se esta evaluando, con los assertions podemos determinar que es lo que aparece antes o despues de un patron. Por ejemplo si queremos que un patron matchee solo al principio del texto, o al final, o en el texto completo.
Aca veremos solo los assertions mas simples.
El caracter especial ^ cuando se encuentra al principio del patron indica que el patron debe matchear desde el principio de la linea. Por default las funciones de expresiones regulares asumen que el texto que se evalua es una sola linea, asi que ^ significa "al principio del texto evaluado" (ver mas adelante como varia ^ cuando se esta en modo multilinea).
El caracter especial $ cuando se encuentra al final del patron indica que debe matchear con el final de la linea. Cuando se considera el texto como una unica linea, $ significaria "con el final del texto". Hay que tener en cuenta que si existiese un salto de linea al final del texto, el caracter este se consideraria "el final del texto", miren este ejemplo para entender esto:
Código:
// aca vamos a usar el tercer parametro opcional de preg_match
// en este parametro podemos indicar una variable que, luego de
// ejecutada la funcion, contendra un arreglo donde el indice 0
// contendra el texto que matcheo con el patron
if (preg_match('/^[0-9]+$/', "145", $matches)) {
// vamos a entrar aca
echo $matches[0]; // muestra "145"
}
if (preg_match('/^[0-9]+$/', "145\n", $matches)) {
// vamos a entrar aca, porque el salto de linea es considerado el
// final del texto, entonces matches con $
echo $matches[0]; // muestra "145" no "145\n", porque los assertions
// no son considerados parte del texto matcheado
}
Modo multilinea
Al usar el modificador m en una expresion regular le estamos indicando que deje de considerar el texto como una unica linea. Esto modifica el comportamiento de ^ y $. Ahora estos caracteres no solo matchean el inicio o el fin del texto, sino el inicio o el fin de cualquier linea dentro del texto, o sea, matchean contra cualquier salto de linea que encuentren.
Otros assertions
\A - inicio del texto
\Z - fin del texto o salto de linea al final
\z - fin del texto
\b - una posicion que sea el inicio o el fin de una palabra (ver el significado de "palabra" en la clase de caracter \w)
\B - una posicion que no sea el inicio o el fin de una palabra
Los subpatrones son las porciones de un patron delimitadas mediante parentesis.
Un subpatron tiene varios usos, se puede utilizar con los caracteres de repeticion para indicar que esa porcion del patron aparece varias veces. Por ejemplo /(<br>)+/, que matchea contra uno o mas saltos de linea de HTML.
Ademas si utilizamos la funcion preg_match con el tercer parametro, este se convierte en un arreglo con los textos de los subpatrones matcheados, usando como indice el numero de subpatron. Los subpatrones se numeran segun el orden en que aparecen en la expresion regular, y se reserva el indice 0 para el texto matcheado por el patron completo. Veamos un ejemplo para entender esto:
Código:
preg_match('/<b>(.*)<\\/b>/', 'Esta palabra esta en <b>negrita</b>', $matches);
echo $matches[1]; // va a escribir "negrita"
Tambien podemos usar los subpatrones para reescribir el texto matcheado al usar la funcion preg_replace usando el contenido de los subpatrones. Para incluir el contenido de un subpatron en el texto a usar como reemplazo se utiliza la barra invertida (\) seguida por el numero de subpatron. Por ejemplo:
Código:
echo preg_replace('/<b>(.*)<\\/b>/', '<i>\1</i>','Esta palabra esta en <b>negrita</b>');
// lo anterior va a escribir: Esta palabra esta en <i>negrita</i>
A la notacion "\<numero de subpatron>" para referirse al contenido de un subpatron se la llama "referencia hacia atras" (back-reference) y se puede utilizar tambien dentro de un patron. En este caso el patron va a matchear si en el lugar de la back-reference aparece el mismo contenido matcheado antes por el subpatron. Por ejemplo: /<([^>]+)>.*<\/\1>/
Que matchearia contra: <b>....</b>
O: <i>....</i>
O: <td>...</td>
El caracter "|" se utiliza en una expresion regular para incluir un patron alternativo, que se utilizara si el anterior falla. Por ejemplo /hombre|mujer/ matcheara tanto contra un texto que contenga la palabra "hombre" o la palabra "mujer".
Tambien podemos usarlo dentro de un subpatron para especificar un subpatron alternativo, por ejemplo: /<(table|tr|td)>.*<\/\1>/. Observen que podemos incluir mas de un patron alternativo. Es importante recordar que los patrones se van a testear en el orden en que aparecen en la expresion regular, veamos un ejemplo donde es importante el orden de los patrones alternativos:
Código:
preg_match('/(.*)(<|<=)(.*)/', '3<=4', $matches);
echo $matches[1]; //escribe "3"
echo $matches[2]; //escribe "<"
echo $matches[3]; //escribe "=4"
preg_match('/(.*)(<=|<)(.*)/', '3<=4', $matches);
echo $matches[1]; //escribe "3"
echo $matches[2]; //escribe "<="
echo $matches[3]; //escribe "4" Espero te sirva |