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.
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.
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
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
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.
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}$
/([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.
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
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.
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}$
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.
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
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.
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 ;)
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.
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.
\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
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?)\])$
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!
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
Ups, perdon, error de copiar y pegar del editor :P
Ahi esta corregida, ahora la explico (y creo que hare un cambio mas :P)
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
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]+))$
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?
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
$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
$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]+)(?![.,]))$/;
:P
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.
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;
}
}
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 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
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.
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)
Deberian haber unas cuantas pruebas, asi uno pasa un buen rato xD.