Autor
|
Tema: Expresión regular (Leído 6,302 veces)
|
IWKY
Desconectado
Mensajes: 267
|
Bueno, pues parece que ya he encontrado lo que estaba buscando en el rfc2822 se especifica el tamaño y los caracteres permitidos, así pues, los caracteres permitidos para la parte local (antes de @) son: Letras minúsculas y mayúsculas (a-z, A-Z) Dígitos 0 a 9 Caracteres ! # $ % & ' * + - / = ? ^ _ ` { | } ~ También el carácter ., no puede aparecer ni al inicio ni en el fin de la parte local, además no puede aparecer dos o más veces consecutivas. Además de esto, también están permitidos las cadenas de texto entre comilladas, por ejemplo, "este ejemplo"@server.com y se distingue entre mayúsculas y minúsculas, no es lo mismo micorreo@server.com que miCorreo@server.comalgunas direcciones validas serian: El problema viene que después del estándar cada uno hace lo que quiere, así pues los servidores de correo admiten algunos caracteres o todos, habrá servidor que los admitirá todos (lo dudo) y habrá servidor que admitirá menos caracteres. También se especifica que la longitud mínima es de 6 caracteres y la máxima de 255. Fuente de todo lo anterior: http://en.wikipedia.org/wiki/E-mail_addressY una expresión regular que valida todo lo anterior ^(?!\.)("([^"\r\\]|\\["\r\\])*"|([-a-z0-9!#$%&'*+/=?^_`{|}~] |(?@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$ Hay una nota en la web de donde la he sacado que dice: The part in bold is the local part. I am not worrying about checking my assumptions for the domain part for now. Entiendo de esto que la parte que esta en negrita es la que valida la parte local y el chico este dice que no le preocupa la parte del dominio que es trivial. fuente: http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspxEntonces haría que añadir la parte de después de la @, quedando entonces del siguiente modo. ^(?!\.)("([^"\r\\]|\\["\r\\])*"|([-a-z0-9!#$%&'*+/=?^_`{|}~] |(?@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]@[\w]+([\.\-\_][\w]+)*\.[\w]{2,4}$ Nota: Dice que esta expresión regular no es sensible a diferenciar las mayúsculas y minúsculas, cosa que se debería de cumplir para ajustarse al estándar. PD: No me queda muy claro que caracteres contiene \w, ¿Alguien lo podría explicar? EDITO: Me ha faltado comentar que la parte del dominio, también se puede escribir indicando la ip del mismo del siguiente modo: user@[123.123.123.123] vamos lo que seria un ip bien formada encerrada entre corchetes.
|
|
|
|
« Última modificación: 24 Enero 2010, 12:04 por IWKY »
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
\w = [a-zA-Z0-9] (caracteres alfanumericos)  \W = [^a-zA-Z0-9] (caracteres no alfanumericos, o sea, simbolos) ^(?!\.)("([^"\r\\]|\\["\r\\])*"|([-a-z0-9!#$%&'*+/=?^_`{|}~] |(?@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]@[\w]+([\.\-\_][\w]+)*\.[\w]{2,4}$ Esa expresion esta mal formada, o al menos el RegexBuddy me la toma como erronea (faltan cierres de parentesis  ) Estoy trabajando en una alta expresion regular que se adapte a esa forma EDIT:^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)?(?![.,])$ Ahi esta la expresion regular "master of the sopa"  Explicacion... (?![.,]) -> No puede empezar con . o , (?: -> Aca separamos, puede haber texto o texto entre comillas [\w!#$%&'*+/=?^_`{|}~\-]+ -> debe empezar con una o mas letras o simbolos (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)* -> los . y , no pueden ser consecutivos, por lo tanto lo que sea que les siga debe ser los otros caracteres admitidos | (?>\".+\") -> Puede haber cualquier cosa entre las comillas, pero si o si deben haber 2 )+ -> Pueden haber texto y texto entre comillas mezclado (?![.,]) -> la parte local no debe terminar con . o , @ -> Simbolo arroba -- Aca puse el mismo criterio que la parte local, solo que no se puede escribir texto entre comillas (?![.,]) -> No puede empezar con . o , [\w!#$%&'*+/=?^_`{|}~\-]+ -> deben haber una o mas letras o simbolos (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)* -> Idem arriba sobre los .y , consecutivos (?:\.[a-zA-Z]+)? -> puede como no tener una parte de dominio (ej: .com, .net, etc; esto lo idee en base a la expresion regular mas arriba, que lo ponia como condicional) (?![.,]) -> no puede terminar con . o con ,
Funciona con todos los mails de ejemplo que pusiste, estoy activo  Me dices si te sirve o no 
|
|
|
|
« Última modificación: 24 Enero 2010, 11:43 por raul338 »
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Perfecto, solo que se me olvido mencionar un detalle en mi último post,  La parte del dominio también puede ser una ip, y se debe de escribir del siguiente modo, correo@[123.123.123.123], bueno este si que seria el último detalle para cumplir con el estándar. Gracias por la explicación. Supongo que podría quedar así: ^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@((?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)?(?![.,]))|(\[(25[012345]|2[01234]\d|[01]?\d\d?)\.(25[012345]|2[01234]\d|[01]?\d\d?)\.(25[012345]|2[01234]\d|[01]?\d\d?)\.(25[012345]|2[01234]\d|[01]?\d\d?)\])$
|
|
|
|
« Última modificación: 24 Enero 2010, 12:48 por IWKY »
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
es muy largo eso, jeje.... para validar una IP en la manera simple es asi: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} Un poco mas "exacta" seria asi: (?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})) entonces esta ultima agregada a mi expresion regular seria mas o menos asi: ^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$ Corregido!
|
|
|
|
« Última modificación: 24 Enero 2010, 19:51 por raul338 »
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Podrías explicarme esa expresión si no es mucho pedir,  porque dices que has incluido la verificación de la ip en la parte del host, y no lo veo o no se leerlo bien que será lo más seguro. Eres un fenómeno de las expresiones regulares. Un saludo
|
|
|
|
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
Ups, perdon, error de copiar y pegar del editor  Ahi esta corregida, ahora la explico (y creo que hare un cambio mas  )
|
|
|
|
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Ups, perdon, error de copiar y pegar del editor  Ahi esta corregida, ahora la explico (y creo que hare un cambio mas  ) Where is it??? Se te ha olvidado poner la expresión, jajjaja
|
|
|
|
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
emm....esta modificado en el mensaje anterior  ^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$
|
|
|
|
« Última modificación: 2 Febrero 2010, 15:03 por raul338 »
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Bueno...... ahora si te digo que no me valida los correos, que me dices?? jejej $exp = "/^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/"; if(!preg_match($exp, $value)){ $array_err[2] = $key; }Si el correo es correcto, $array_err[2] no debería de contener el valor $key y en cambio si lo contiene, ¿Hay algo mal?
|
|
|
|
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
(?![.,]) -> no debe empezar con . o , (?: -> Grupo: texto entre comillas o texto simple con simbolos [\w!#$%&'*+/=?^_`{|}~\-]+ -> Letras o simbolos (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)* -> ., no pueden estar consecutivos | (?>\".+\") -> Texto entre comillas )+ -> Se pueden repetir varias veces (?![.,]) -> no puede terminar con . o , @ -> simbolo arroba (?> -> Grupo: puede ser una IP o texto con simbolos \[(?  ?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?  ?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\] | ->Texto con simbolos... (?![.,]) -> No puede empezar con . o , [\w!#$%&'*+/=?^_`{|}~\-]+ -> letras y simbolos (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)* -> ., no consecutivos (?:\.[a-zA-Z]+) -> Tiene que terminar como dominio (aca es generico, acepta cualquier cosa...) (?![.,]) -> Tampoco puede terminar con . o , ) Y la explicacion de la expresion regular de IP: (?: -> Grupo 1: (?> -> Aca separamos, el maximo de cada grupo de una IP es 255 2 -> Si empieza con 2... (?> 5[0-5] -> y sigue con 5, que pueda hasta 55 | [0-4]?\d) -> caso contrario, que sea de 0 a 49 | 1? -> o puede ser que sea 100 o menor \d{1,2} -> numero...de no mas de 2 cifras ) \. -> un punto ){3} -> se debe repetir 3 veces la captura del grupo (?: -> Aca se repite exactamente el mismo grupo, pero sin el punto final (?> -> Aca separamos, el maximo de cada grupo de una IP es 255 2 -> Si empieza con 2... (?> 5[0-5] -> y sigue con 5, que pueda hasta 55 | [0-4]?\d) -> caso contrario, que sea de 0 a 49 | 1? -> o puede ser que sea 100 o menor \d{1,2} -> numero...de no mas de 2 cifras ) )
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.Bueno...... ahora si te digo que no me valida los correos, que me dices?? jejej $exp = "/^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/"; if(!preg_match($exp, $value)){ $array_err[2] = $key; }Si el correo es correcto, $array_err[2] no debería de contener el valor $key y en cambio si lo contiene, ¿Hay algo mal? Es porque estas poniendo mal la expresion, si la pones entre comillas no debes poner los "/" de inicio y cierre  o pones $exp = "^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$"; o sino $exp = /^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/;

|
|
|
|
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Probe como dices y sigue sin funcionar, y otras expresiones si que me funcionan, pego un trozo más grande del script, y así de paso puedes ver las otras expresiones, por si estuvieran mal, jejej  Si le quito la / de inicio y fin, no funciona, por ejemplo en la primera que valida nombres, si le quito la /, no funciona y si se la pongo si que funciona bien. foreach($_POST as $key => $value){ switch($key){ case "Nombre": if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){ $array_err[0] = $key; } break; case "Apellidos": if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){ $array_err[1] = $key; } break; case "Email": $exp = "^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$"; if(empty($value) or !preg_match($exp, $value)){ $array_err[2] = $key; } break; case "Password": case "Password1": if((empty($_POST['Password']) and empty($_PAST['Password1'])) or ($_POST['Password'] != $_POST['Password1'])){ $array_err[3] = $key; } break; case "Dni": if(empty($value) or !preg_match("/^[0-9]{8}[A-Z]{1}$/", $value)){ $array_err[4] = $key; } $numero = substr($value, 0, -1); $letras = array("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"); $dni = $numero . $letras[$numero%23]; if($dni != $value){ $array_err[4] = $key; } break; case "Pais": if(empty($value)){ $array_err[5] = $key; } break; case "CodigoPostal": if(empty($value) or !preg_match("/^[0-9]{5}$/", $value)){ $array_err[6] = $key; } break; case "Direccion": if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){ $array_err[7] = $key; } break; case "Ciudad": if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){ $array_err[8] = $key; } break; case "Provincia": if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){ $array_err[9] = $key; } break; case "Numero": if(empty($value) or !preg_match("/^[0-9]{1,4}$/", $value)){ $array_err[10] = $key; } break; case "Planta": if(empty($value) or !preg_match("/^[0-9]{1,3}$/", $value)){ $array_err[11] = $key; } break; case "Puerta": if(empty($value) or !preg_match("/^[\w]{1,4}$/", $value)){ $array_err[12] = $key; } break; case "Telefono": if(empty($value) or !preg_match("/^[0-9]{9}$/", $value)){ $array_err[13] = $key; } break; } }
|
|
|
|
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
Este es el codigo generado por el ReggexBuddy con el que edito mis expresiones regulares if (preg_match('/^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$/', $value)) { # Successful match } else { # Match attempt failed } Referencia de porque lo hize asiexplicacion detallada de la expresionFijate si te funciona, yo ahora no puedo probar 
|
|
|
|
« Última modificación: 20 Marzo 2010, 14:19 por raul338 »
|
En línea
|
|
|
|
IWKY
Desconectado
Mensajes: 267
|
Funciona perfecto, eres un maestro de las expresiones regulares, por lo que veo has añadido algunas \ para escapar las / y por lo demás esta igual, gracias, he aprendido mucho y me ha gustado debatir este tema contigo.
Un saludo.
|
|
|
|
|
En línea
|
|
|
|
raul338
Conectado
Mensajes: 2.199
La sonrisa es la mejor forma de afrontar las cosas
|
jeje...son fascinante las expresiones regulares, y cada dia aprendo mas de ellas  En este tema aprendi que existia el (?!...), que sirve que cancele el analisis si se cumple la condicion que esta dentro (en lugar de seguir avanzando como lo hacen otros  )
|
|
|
|
|
En línea
|
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 907
|
Deberian haber unas cuantas pruebas, asi uno pasa un buen rato xD.
|
|
|
|
|
En línea
|
|
|
|
|
|