Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => 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: '/^[^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: '/^[^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

'/^[^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
^[\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:

^[a-zA-Z][\w\.\-\_]+\@[\w\.\-\_]+\.\w{2,4}$
Título: Re: Expresión regular
Publicado por: ~ Yoya ~ en 24 Enero 2010, 00:29 AM
/([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
[\w\.\-\_]
si con
[\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
Cita de: raul338 en 24 Enero 2010, 00:18 AM
entonces haz una expresion mas simple
^[\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:

^[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
^[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:
^[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 123mail@mail.com, para eso supondo que se debería de añadir lo siguiente al inicio [^0-9]
quedando así las expresión ^[^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.
^/[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
Cita de: yoyahack en 24 Enero 2010, 00:40 AM
Esta exprecion no es muy confiable:
^[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 :)
Cita de: yoyahack en 24 Enero 2010, 00:53 AM
Bueno, si el mail comienza con letra tu exprecion falla. aqui explico la mia.
^/[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)
Cita de: raul338 en 24 Enero 2010, 00:18 AM
entonces haz una expresion mas simple
^[\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):

^[\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: ^[\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 ^(?!\.)("([^"\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:
CitarThe 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.
^(?!\.)("([^"\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)

^(?!\.)("([^"\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" :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í:
^(?![.,])(?:[\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:
\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!
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
Cita de: 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)

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

^(?![.,])(?:[\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 (php) [Seleccionar]

$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?
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:


(?: -> 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.
Cita de: 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 (php) [Seleccionar]

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

o pones
Código (PHP) [Seleccionar]

$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
Código (PHP) [Seleccionar]

$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]+)(?![.,]))$/;


: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 (php) [Seleccionar]
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;
}
}
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 (PHP) [Seleccionar]

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 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.