Título: Expresión regular Publicado por: IWKY en 23 Enero 2010, 22:44 pm Hola, he encontrado esta expresión regular para validar direcciones de correos electrónicos por la web, pero creo que no validaría bien todos los correos electrónicos.
Original: Código: '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/' Creo que así funcionaría mejor, ¿qué decís? Corregido: Código: '/^[^0-9][a-zA-Z0-9_]+([.][-][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][-][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/' NOTA: fijaos que he añadido [-] después de [.], es que no se como remarcarlo para que se vea claro. Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 23 Enero 2010, 23:23 pm Aver, pon ejemplo un de un correo, porque usas tantas cosas innecesarias que creo que no es un correo común xD.
Poner un ejemplo del correo y decir que parte del correo necesitas sacar... Porque estas gastando recursos innecesarios. Saludos. Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 00:00 am No es que quiera sacar una parte concreta, simplemente validar un correo, vamos que no pongan caracteres extraños, un ejemplo seria...
esto.esun_ejemplo.de-correo@deun-servior.com.com.es Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 00:03 am Esa expresion regular no funcionaria bien, porque estas obligando al usuario a tener un mail con ".-" o sin el, debias ponerlo en el mismo delimitador "[.-]", a parte tambien separa el "_" de las letras, porque funcionaria con "raul___338@elchacker.net" jaja xD
Código: '/^[^0-9][a-zA-Z0-9_]+([.-_][a-zA-Z0-9]+)*[@][a-zA-Z0-9_]+([.-][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/' Ahi practicamente deberia funcionar con todos ;) Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje Con ese correo funciona, ya me fije :P Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 00:09 am Gracias, es que me estoy iniciando en las expresiones regulares y aún no se muy bien como funcionan del todo.
Otra consulta, ejemplo_correo-@server.com ejemplo@mi_server-raro.com -ejemplo-@server.com 123server@123.com user_@_server.com _user_@_server_.com Vamos en definitiva que no se donde mirar como se rige un correo electrónico. Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 00:18 am entonces haz una expresion mas simple
Código: ^[\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ para que te vas a romper la cabeza intentando poner miles de formas raras??? .... esa expresion funciona con todos los mails que pusiste pero ... (segun que yo sepa) estos correos no son validos: 123server@123.com _user_@_server_.com -ejemplo-@server.com y en caso de que quieras una expresion regular que no valide esos correos, aqui tienes una: Código: ^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 24 Enero 2010, 00:29 am Código: /([a-z0-9_.-]+)@([a-z0-9_-]+)\.\w{2,3}/i Tampoco es necesario poner Código: [\w\.\-\_] Código: [\w.-_] La de raul338 parece una exprecion regular ofuscada jajaja. Saludos. Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 00:31 am entonces haz una expresion mas simple Código: ^[\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ para que te vas a romper la cabeza intentando poner miles de formas raras??? .... esa expresion funciona con todos los mails que pusiste pero ... (segun que yo sepa) estos correos no son validos: 123server@123.com _user_@_server_.com -ejemplo-@server.com y en caso de que quieras una expresion regular que no valide esos correos, aqui tienes una: Código: ^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ Bueno había un error en mi ultimo post, ya esta corregido, en cuanto a la segunda expresión Código: ^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ ^ -> inicio de la cadena [a-zA-Z] -> solo contiene letras minúsculas y mayúsculas [\w\.\-\_]+ -> se pueden repetir 1 o más veces caracteres alfanumericos, el ., el - y el _, ¿La \w no engloba a [a-zA-Z0-9_]? si es así sobra el \_ \@ -> caracter arroba [\w\.\-\_]+ -> Lo mismo que en el de arriba \. -> caracter . \w{2,4} -> Dominio de 2 a 4 caracteres, ¿Si \w es alfanumerico incluyendo _? validaría dominios erróneos, ¿no? $ -> Fin de la cadena Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 24 Enero 2010, 00:40 am Esta exprecion no es muy confiable:
Código: ^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 00:46 am O sea una entrada de este estilo
Código: 123mail@mail.com quedando así las expresión Código: ^[^0-9][a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 24 Enero 2010, 00:53 am Bueno, si el mail comienza con letra tu exprecion falla. aqui explico la mia.
Código: ^/[a-z0-9_.-]+\@[a-z0-9._-]+\.\w{2,3}$/i Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 01:07 am Esta exprecion no es muy confiable: Código: ^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ Lee bien :P dije que a mi no me parece que un mail deberia empezar con numeros o simbolos, por eso puse que empieze con una letra y despues lo que sea :) Bueno, si el mail comienza con letra tu exprecion falla. aqui explico la mia. es identica a mi segunda opcion (la mas simple)Código: ^/[a-z0-9_.-]+\@[a-z0-9._-]+\.\w{2,3}$/i entonces haz una expresion mas simple Código: ^[\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$ para que te vas a romper la cabeza intentando poner miles de formas raras??? .... esa expresion funciona con todos los mails que pusiste Y aca esta mejorada, no permite simbolos consecutivos, (aunque esto no lo probe, deberia funcionar): Código: ^[\w]+([.-_][\w]+)*\@[\w]+([.-_][\w]+)*\.\w{2,4}$ ^ -> inicio de linea [\w]+ -> Empieza si o si con una o mas letras o numeros ([.-_][\w]+)* -> puede haber uno o mas grupos de la siguente forma: (simbolo)(letroa o numeros) \@ -> Simbolo Arroba [\w]+([.-_][\w]+)* -> Idem. Arriba \.\w{2,4} -> un punto y el final de la direccion (entre 2 y 4, ej: .ar, .net, .com, etc) $ -> fin de linea la \w es simplemente valores alfanumericos, no simbolos :P Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 24 Enero 2010, 01:21 am Naaa la mía no es indentica a la tuya, la mía es mejor jajaja (broma).
Ps eso, el $ indica que algo debe estar al final de la cadena, no indica el final de la cadena. Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 01:35 am nop, el $ significa fin de linea, si hay algo mas de lo ultimo que se especifico, la expresion regular es invalida, el ^$ es usado para comprobar textos con expresiones regulares /(normalmente), en cambio cuando se requieren "obtener" parte del texto analizado, es conveniente no usarlos ;)
Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 03:01 am Bien pero también hay que saber como es un email realmente, donde esta definido que caracteres puede llevar y cuales no, en que posiciones se permiten que caracteres y en cuales no, y a partir de ahí se puede hacer una buena expresión regular.
Entonces: Código: ^[\w]+([\.\-_][\w]+)*@[\w]+([\.\-\_][\w]+)*\.[\w]{2,3}$ Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 04:27 am Bueno, pues parece que ya he encontrado lo que estaba buscando en el rfc2822 (http://tools.ietf.org/html/rfc2822#section-3.4) 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.com algunas direcciones validas serian: Cita de: Hay algunos repetidos abc@example.com Abc@example.com aBC@example.com abc.123@example.com 1234567890@example.com _______@example.com abc+mailbox/department=shipping@example.com !#$%&’*+-/=?^_`.{|}~@example.com (todos estos caracteres están permitidos) “abc@def”@example.com (cualquier cosa que esté entre comillas) “Fred Bloggs”@example.com “Fred \”quota\” Bloggs”@example.com (ojo, las comillas deben escaparse) "Abc\@def"@example.com "Fred Bloggs"@example.com "Joe\\Blow"@example.com "Abc@def"@example.com customer/department=shipping@example.com $A12345@example.com !def!xyz%abc@example.com _somename@example.com 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_address Y una expresión regular que valida todo lo anterior Código: ^(?!\.)("([^"\r\\]|\\["\r\\])*"|([-a-z0-9!#$%&'*+/=?^_`{|}~] |(?@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$ Citar 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.aspx Entonces haría que añadir la parte de después de la @, quedando entonces del siguiente modo. Código: ^(?!\.)("([^"\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. Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 11:02 am \w = [a-zA-Z0-9] (caracteres alfanumericos) :P
\W = [^a-zA-Z0-9] (caracteres no alfanumericos, o sea, simbolos) Código: ^(?!\.)("([^"\r\\]|\\["\r\\])*"|([-a-z0-9!#$%&'*+/=?^_`{|}~] |(?@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]@[\w]+([\.\-\_][\w]+)*\.[\w]{2,4}$ Estoy trabajando en una alta expresion regular que se adapte a esa forma ;) EDIT: Código: ^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)?(?![.,])$ Ahi esta la expresion regular "master of the sopa" :laugh: Explicacion... Citar (?![.,]) -> 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 :P Me dices si te sirve o no :P Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 12:03 pm Perfecto, solo que se me olvido mencionar un detalle en mi último post, :xD 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í: Código: ^(?![.,])(?:[\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?)\])$ Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 18:42 pm es muy largo eso, jeje.... para validar una IP en la manera simple es asi:
Código: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} Un poco mas "exacta" seria asi: Código: (?:(?>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: Código: ^(?![.,])(?:[\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! Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 19:31 pm Podrías explicarme esa expresión si no es mucho pedir, :xD 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 Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 19:42 pm Ups, perdon, error de copiar y pegar del editor :P
Ahi esta corregida, ahora la explico (y creo que hare un cambio mas :P) Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 20:29 pm Ups, perdon, error de copiar y pegar del editor :P Ahi esta corregida, ahora la explico (y creo que hare un cambio mas :P) Where is it??? Se te ha olvidado poner la expresión, jajjaja Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 20:34 pm emm....esta modificado en el mensaje anterior :P
Código: ^(?![.,])(?:[\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]+))$ Título: Re: Expresión regular Publicado por: IWKY en 24 Enero 2010, 20:43 pm Bueno...... ahora si te digo que no me valida los correos, que me dices?? jejej
Código
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? Título: Re: Expresión regular Publicado por: raul338 en 24 Enero 2010, 20:54 pm Citar (?![.,]) -> 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: Código: (?: -> Grupo 1: 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 Es porque estas poniendo mal la expresion, si la pones entre comillas no debes poner los "/" de inicio y cierre :PCódigo
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? o pones Código o sino Código
:P Título: Re: Expresión regular Publicado por: IWKY en 25 Enero 2010, 16:10 pm 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 :xD :xD
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. Código
Título: Re: Expresión regular Publicado por: raul338 en 25 Enero 2010, 19:27 pm Este es el codigo generado por el ReggexBuddy con el que edito mis expresiones regulares
Código
Referencia de porque lo hize asi (http://foro.elhacker.net/php/expresion_regular-t282130.0.html;msg1390938#msg1390938) explicacion detallada de la expresion (http://foro.elhacker.net/php/expresion_regular-t282130.0.html;msg1391341#msg1391341) Fijate si te funciona, yo ahora no puedo probar :P Título: Re: Expresión regular Publicado por: IWKY en 25 Enero 2010, 21:31 pm 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. Título: Re: Expresión regular Publicado por: raul338 en 25 Enero 2010, 21:40 pm jeje...son fascinante las expresiones regulares, y cada dia aprendo mas de ellas :xD
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 :P) Título: Re: Expresión regular Publicado por: ~ Yoya ~ en 25 Enero 2010, 23:57 pm Deberian haber unas cuantas pruebas, asi uno pasa un buen rato xD.
|