Intento contestar ahora con una versión algo más extendida, explicando el por qué.
El día 0 que hice la clase Filter lo primero que pensé fué utilizar filter_var como en el resto de métodos. ¿Para qué iba a inventar algo cuando PHP ya lo soportaba?, desde luego era la opción fácil.
El problema vino cuando empecé a hacer tests y vi que PHP aceptaba prácticamente cualquier cosa con forma de e-mail y no encontré nadie que hubiera solucionado esto de manera convincente. Ejemplos de emails aceptados por filter_var serían entonces test@local o
ho...@127.0.0.1 por lo que acababa llenando de basura cualquier registro abierto al público. En ese momento filter_var NO CUMPLIA con el RFC, por lo que no veía beneficio en usarlo.
Por otro lado, si hacía una implementación estricta del RCF, tendría que permitir cosas como antonia@[127.0.0.1] (que es RFC válido) pero si tienes una aplicación online y la gente se registra con este tipo de emails, hay un 99,9% de posibilidades que sea SPAM. Este tipo de direcciones tampoco pasaban por el filter_var (probablemente esto haya evolucionado con el paso del tiempo) aún siendo como decía válidas en el RFC. La funcion de PHP quedaba lejos de tener una utilidad real.
Así que la solución práctica fue permitir tan solo emails con un TLD válido y además complementar esto con una validación de registro MX. Empecé a buscar la expresión regular que pasaba una burrada de casos y la puse online, con un sistema paralelo que aquellas que no pasaban se logeaban para una posterior revisión y refinamiento del sistema. Y con este registro complementé la validación y pasaron por allí unas 60.000 direcciones y fui tuneándola para añadir más casos, como por ejemplo TLDs extraños como .mil (si, tuve registros de estos dominios O_O )
Quizá reinventé la rueda en ese momento pero ya os digo que en ese momento no había alternativa que usar, casi todos los frameworks que he mirado utilizan filter_var directamente (e.g:
Symfony) y parece que ya les es suficiente. Desconozco si con el paso de los años la validación de emails ha mejorado, ciertamente el uso de filter_var es o debería ser un "industry standard".
La casuística que probé fue sobretodo la de que emails validos fueran bien detectados, pero tampoco lleva al extremo el caso de que emails inválidos que no pasaran. Veo que esto no fue suficiente u habéis encontrado este caso de
pepe..@loquesea.com que es inválido y no se detecta.
Propuesta
1) Añadir a la expresión regular las condiciones que faltan
2) Cambio por filter_var en el caso de que haya prosperado. Condición imprescindible la de hacer un test de la muerte :)
Si vamos en la dirección del punto 2, hagamos un test con PHPUnit, que se nos debería caer a todos la cara de vergüenza ya. Yo el primero que tengo ficheros de test no versionado en mi ordenador.