2009-02-19 17 views
7

Voglio convalidare una stringa che può essere un'e-mail o più e-mail separate da virgole.Convalida più messaggi di posta elettronica Comma Separato con javascript

Ad esempio:

[email protected] -> TRUE
disegno di legge -> FALSO
bill.gates @ microsoft.com, steve.jobs @ apple.com" -> TRUE
bill.gates @ microsoft.com, steve.jobs @ apple.com, bob "-> false
bob, bill.gates @ microsoft.com, steve.jobs @ apple.com" -> false

sono venuto con il prossimo codice che funziona con i casi di test

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; 
} 

È questo il modo più rapido per farlo? Cosa succede se voglio consentire; e, come separatore?

risposta

0

Che ne dici di suddividere la stringa in una matrice e di eseguirne il looping passando un solo indirizzo e-mail alla volta?

3

Utilizzare var result = value.split(","). Finisci con un array.

8

Non si dovrebbe corrispondere domini di primo livello con [A-Z]{2,4}:

Che dire .museum o .travel? Che dire dei domini IDNA come .xn--0zwm56d o .xn--11b5bs3a9aj6g?

Inoltre, è perfettamente valido avere un indirizzo di posta elettronica come "John Doe"@example.org.

A mio parere, tutto quello che dovresti controllare sul lato client è se l'indirizzo contiene un @ e se c'è almeno uno . dopo di esso. Sul lato server, è possibile verificare se il server esiste (si potrebbe anche voler provare a connettersi alla porta SMTP appropriata) o semplicemente inviare una mail di convalida.

Tutto il resto è soggetto a errori come la regex effettiva per verificare gli indirizzi e-mail validi looks like this.


Inoltre, questo

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

è una seria WTF - test() restituisce già un valore booleano!


Se si desidera consentire diversi separatori, usare un'espressione regolare invece che una stringa per la divisione, per esempio

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

Modifica consigliata: "... dovresti controllare sul lato client se l'indirizzo contiene ** uno e solo uno ** @ ..." (tuttavia, presumo che "@" non sia consentito nel locale -part ??) – Kristen

+2

@Kristen: '@' è consentito nelle stringhe tra virgolette, ma solo lì; Non ho mai visto le stringhe utilizzate, sebbene possano fornire un modo semplice per confondere i bot spam; si dovrebbe anche tenere a mente che i seguenti caratteri sono validi anche senza citare:! # $% & '* + -/=?^_ '{|} ~ – Christoph

+0

btw, penso di aver letto una volta che c'erano anche persone che usavano la posta -indirizzi con un dominio ccTLD non elaborato dopo "@"; non ricordo in quale paese, però ... – Christoph

1

In generale è non possibile convalidare gli indirizzi di posta elettronica. Qualcosa che è sintatticamente valido non va necessariamente da nessuna parte, e anche se lo fa, se verrà letto.

E anche in questo caso, la copertura di tutti gli indirizzi sintatticamente corretti (in base alla RFC applicabile) richiede una regex estremamente complessa (vedere la prima edizione di "Mastering Regular Expressions" (Friedl, O'Reilly) per il carattere 4724 o 6598 versioni, e queste probabilmente non gestiscono gli IDN). Per esempio.un apostrofo è un carattere valido nella parte locale e puoi inserire commenti all'interno dell'e-mail.

2

Regex:

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

ho usato validationEngine e underscore.js per fare questo:

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; 
} 

E poi decorato la mia campo modulo con:

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

vorrei lanciare un $.trim(result[i]) nella funzione validateMultipleEmailsCommaSeparated poiché molte persone aggiungeranno lo spazio dopo la virgola.

Naturalmente questa è una cosa jQuery, quindi l'equivalente è la tua strada.

0

usato questo per PHP preg_match_all()

$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

provare questo

 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; 
    } 

accetta sia virgola e punto e virgola come separatore, cambiare la situazione se desideri solo virgola come separatore

Problemi correlati