Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: IWKY en 23 Enero 2010, 22:44 pm



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, los correos electrónicos pueden tener las siguientes formas o alguna combinación de ellas ¿Cual de estas combinaciones no es correcta?:

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
Bueno esta es la mía, le pongo el operador i al final que dice que ignore el uso de mayúscula y minúscula.

Tampoco es necesario poner
Código:
[\w\.\-\_]
si con
Código:
[\w.-_]
Estas haciendo lo mismo.
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}$
Hay un par de cosas que no tengo claro,  a ver si me puedes ayudar.
^ -> 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}$
Ya que primero dice que si al principio aparecen palabras en mayuscula o minuscula y si al principio no hay palabras si no numero no funcionara la exprecion regular como deberia de ser.


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
, para eso supondo que se debería de añadir lo siguiente al inicio [^0-9]
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
Primero indico que la cadena debe comenzar con letras, numero, guion y punto y indico que pueden aparecer una o mas veces. luego con el @ indico que hasta hay llegara o si no se toma todo, luego indico que despues del @ pueden haber, letras, numero, puntos y guion.luego indico el punto  y despues indico que despues del punto puede aparecer, numeros, letras y guion y que debe tener minimos 2 caracter y maximo 3 y que solo debe estar al final.


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}$
Ya que primero dice que si al principio aparecen palabras en mayuscula o minuscula y si al principio no hay palabras si no numero no funcionara la exprecion regular como deberia de ser.

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.
Código:
^/[a-z0-9_.-]+\@[a-z0-9._-]+\.\w{2,3}$/i
Primero indico que la cadena debe comenzar con letras, numero, guion y punto y indico que pueden aparecer una o mas veces. luego con el @ indico que hasta hay llegara o si no se toma todo, luego indico que despues del @ pueden haber, letras, numero, puntos y guion.luego indico el punto  y despues indico que despues del punto puede aparecer, numeros, letras y guion y que debe tener minimos 2 caracter y maximo 3 y que solo debe estar al final.
es identica a mi segunda opcion (la mas simple)
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}$
Seria la expresión final, para reconocer correos electronicos, bien formados.


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]$
Hay una nota en la web de donde la he sacado que dice:
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}$
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:
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
  1. $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]+)(?![.,]))$/";
  2. if(!preg_match($exp, $value)){
  3.       $array_err[2] = $key;
  4. }

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:
  (?> -> 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
Código
  1. $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]+)(?![.,]))$/";
  2. if(!preg_match($exp, $value)){
  3.       $array_err[2] = $key;
  4. }

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 :P

o pones
Código
  1. $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]+)(?![.,]))$";
  2.  
o sino
Código
  1. $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]+)(?![.,]))$/;
  2.  

: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
  1. foreach($_POST as $key => $value){
  2. switch($key){
  3. case "Nombre":
  4. if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){
  5. $array_err[0] = $key;
  6. }
  7. break;
  8. case "Apellidos":
  9. if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){
  10. $array_err[1] = $key;
  11. }
  12. break;
  13. case "Email":
  14. $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]+)(?![.,]))$";
  15. if(empty($value) or !preg_match($exp, $value)){
  16. $array_err[2] = $key;
  17. }
  18. break;
  19. case "Password":
  20. case "Password1":
  21. if((empty($_POST['Password']) and empty($_PAST['Password1'])) or ($_POST['Password'] != $_POST['Password1'])){
  22. $array_err[3] = $key;
  23. }
  24. break;
  25. case "Dni":
  26. if(empty($value) or !preg_match("/^[0-9]{8}[A-Z]{1}$/", $value)){
  27. $array_err[4] = $key;
  28. }
  29. $numero = substr($value, 0, -1);
  30. $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");
  31. $dni = $numero . $letras[$numero%23];
  32. if($dni != $value){
  33. $array_err[4] = $key;
  34. }
  35. break;
  36. case "Pais":
  37. if(empty($value)){
  38. $array_err[5] = $key;
  39. }
  40. break;
  41. case "CodigoPostal":
  42. if(empty($value) or !preg_match("/^[0-9]{5}$/", $value)){
  43. $array_err[6] = $key;
  44. }
  45. break;
  46. case "Direccion":
  47. if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
  48. $array_err[7] = $key;
  49. }
  50. break;
  51. case "Ciudad":
  52. if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
  53. $array_err[8] = $key;
  54. }
  55. break;
  56. case "Provincia":
  57. if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
  58. $array_err[9] = $key;
  59. }
  60. break;
  61. case "Numero":
  62. if(empty($value) or !preg_match("/^[0-9]{1,4}$/", $value)){
  63. $array_err[10] = $key;
  64. }
  65. break;
  66. case "Planta":
  67. if(empty($value) or !preg_match("/^[0-9]{1,3}$/", $value)){
  68. $array_err[11] = $key;
  69. }
  70. break;
  71. case "Puerta":
  72. if(empty($value) or !preg_match("/^[\w]{1,4}$/", $value)){
  73. $array_err[12] = $key;
  74. }
  75. break;
  76. case "Telefono":
  77. if(empty($value) or !preg_match("/^[0-9]{9}$/", $value)){
  78. $array_err[13] = $key;
  79. }
  80. break;
  81. }
  82. }


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
  1. 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)) {
  2. # Successful match
  3. } else {
  4. # Match attempt failed
  5. }
  6.  

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.