2009-02-19 50 views
7

Quiero validar una cadena que puede ser un correo electrónico o varios correos electrónicos separados por comas.Validar múltiples correos electrónicos Coma Separados con javascript

Por ejemplo:

[email protected] -> TRUE
factura -> FALSO
bill.gates @ microsoft.com, steve.jobs @ apple.com" -> TRUE
bill.gates @ microsoft.com, steve.jobs @ apple.com, sacudida "-> false
sacudida, bill.gates @ microsoft.com, steve.jobs @ apple.com" -> false

vine con el siguiente código que funciona con los casos de prueba.

function validateEmail(field) { 
    var regex=/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/i; 
    return (regex.test(field)) ? true : false; 
} 

function validateMultipleEmailsCommaSeparated(value) { 
    var result = value.split(","); 
    for(var i = 0;i < result.length;i++) 
    if(!validateEmail(result[i])) 
      return false;   
    return true; 
} 

¿Es esta la forma más rápida de hacerlo? ¿Qué sucede si quiero permitirlo? y, como separador?

Respuesta

0

¿Qué le parece dividir la cadena en una matriz y recorrerla pasando solo una dirección de correo electrónico a la vez?

3

Use var result = value.split(","). Terminas con una matriz.

8

Usted no debe coincidir con dominios de nivel superior con [A-Z]{2,4}:

¿Qué hay de .museum o .travel? ¿Qué pasa con los dominios de IDNA como .xn--0zwm56d o .xn--11b5bs3a9aj6g?

Además, es perfectamente válido tener una dirección de correo electrónico como "John Doe"@example.org.

En mi opinión, todo lo que debe verificar en el lado del cliente es si la dirección contiene un @ y si hay al menos un . después de él. En el lado del servidor, puede verificar si el servidor existe (incluso puede intentar conectarse al puerto SMTP apropiado) o simplemente enviar un correo de validación.

Todo lo demás es propenso a errores como la verdadera expresión regular para comprobar las direcciones de correo electrónico válidas looks like this.


Además, este

return (regex.test(field)) ? true : false; 

es un serio WTF - test() ya se devuelve un valor booleano!


Si desea permitir diferentes separadores, utilice una expresión regular en vez de una cadena para dividir, por ejemplo

value.split(/,|;/) 
+0

Edición sugerida: "... debería verificar en el lado del cliente si la dirección contiene ** uno y solo uno ** @ ..." (sin embargo, estoy suponiendo que "@" no está permitido en el local -parte ??) – Kristen

+2

@Kristen: '@' está permitido en cadenas entre comillas, pero solo allí; Nunca he visto las cadenas de comillas usadas, aunque podrían proporcionar una manera fácil de confundir los robots de spam; uno también debe tener en cuenta que los siguientes caracteres son válidos incluso sin citar:! # $% & '* + -/=?^_ '{|} ~ – Christoph

+0

Por cierto, creo que una vez leí que incluso había personas que usaban el correo -address con un dominio ccTLD en bruto después de la '@'; No recuerdo qué país, aunque ... – Christoph

1

En general es no posible validar direcciones de correo electrónico. Algo que es sintácticamente válido no necesariamente va a ninguna parte, e incluso si lo hace, si se leerá.

Y aun así, cubriendo todas las posibles direcciones sintácticamente correctas (de acuerdo con el RFC aplicable) necesita una expresión regular extremadamente compleja (vea la 1 ª edición de "Mastering Regular Expressions" (Friedl, O'Reilly) para el 4724 o 6598 caracteres versiones, y estos probablemente no manejan IDNs). P.ej.un apóstrofo es un carácter válido en la parte local, y puede tener comentarios dentro del correo electrónico.

2

Regex:

((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)* 
0

Solía ​​ValidationEngine y underscore.js para hacer esto:

function validateEmail(field, rules, i, options) { 
if (!_.all(field.val().split(","), function(candidate) { return $.trim(candidate).match(options.allrules.email.regex); })) 
    return options.allrules.email.alertText; 
} 

Y luego decorado mi campo de formulario con:

<input class="validate[required,funcCall[validateEmail]]" type="text" name="contact_email" id="contact_email" value="" /> 
0

que lanzaba una $.trim(result[i]) en esa función validateMultipleEmailsCommaSeparated ya que muchas personas agregarán el espacio después de su coma.

Por supuesto que es algo de jQuery así que haz el equivalente a tu manera.

0

utiliza esto para preg_match_all php()

$pattern = '/([\w+\._%-][email protected][\w+\.-]+\.[\w+]{2,4}[^,;\s])/'; 
$text = '[email protected], efg, [email protected], [email protected] [email protected] [email protected] [email protected]'; 
preg_match_all($pattern, $text, $match); 
var_dump($match); 

array(2) { 
 
    [0] => 
 
    array(5) { 
 
    [0] => 
 
    string(11) "[email protected]" 
 
    [1] => 
 
    string(11) "[email protected]" 
 
    [2] => 
 
    string(13) "[email protected]" 
 
    [3] => 
 
    string(11) "[email protected]" 
 
    [4] => 
 
    string(15) "[email protected]" 
 
    } 
 
    [1] => 
 
    array(5) { 
 
    [0] => 
 
    string(11) "[email protected]" 
 
    [1] => 
 
    string(11) "[email protected]" 
 
    [2] => 
 
    string(13) "[email protected]" 
 
    [3] => 
 
    string(11) "[email protected]" 
 
    [4] => 
 
    string(15) "[email protected]" 
 
    } 
 
}

0

probar esto

 function validateEmails(string) { 
     var regex = /^([\w-\.][email protected]([\w-]+\.)+[\w-]{2,4})?$/; 
     var result = string.replace(/\s/g, "").split(/,|;/);   
     for(var i = 0;i < result.length;i++) { 
      if(!regex.test(result[i])) { 
       return false; 
      } 
     }  
     return true; 
    } 

acepta tanto coma y punto y coma como separador, cambiar eso si solo deseas coma como separador

Cuestiones relacionadas