Проверяйте запятую нескольких писем, разделенных javascript - PullRequest
7 голосов
/ 19 февраля 2009

Я хочу проверить строку, которая может быть электронным письмом или несколькими электронными письмами, разделенными запятыми.

Например:

bill.gates@hotmail.com -> ИСТИНА
счет -> ЛОЖЬ
bill.gates @ microsoft.com, steve.jobs @ apple.com "-> ИСТИНА
bill.gates @ microsoft.com, steve.jobs @ apple.com, bob "-> false
боб, bill.gates @ microsoft.com, steve.jobs @ apple.com "-> false

Я вышел со следующим кодом, который работает с тестовыми примерами.

function validateEmail(field) {
    var regex=/\b[A-Z0-9._%+-]+@[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;
}

Это самый быстрый способ сделать это? Что если я хочу разрешить; и, как разделитель?

Ответы [ 9 ]

8 голосов
/ 19 февраля 2009

Вы не должны сопоставлять домены верхнего уровня с [A-Z]{2,4}:

А как насчет .museum или .travel? А как насчет доменов IDNA, таких как .xn--0zwm56d или .xn--11b5bs3a9aj6g?

Кроме того, вполне допустимо иметь адрес электронной почты, такой как "John Doe"@example.org.

По моему мнению, все, что вы должны проверить на стороне клиента, это если адрес содержит @ и если после него есть хотя бы один .. На стороне сервера вы можете проверить, существует ли сервер (вы можете даже попытаться подключиться к соответствующему порту SMTP) или просто отправить письмо с подтверждением.

Все остальное подвержено ошибкам, так как фактическое регулярное выражение для проверки действительных адресов электронной почты выглядит так .


Также этот

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

является серьезным WTF - test() уже возвращает логическое значение!


Если вы хотите разрешить разные разделители, используйте регулярное выражение вместо строки для разбиения, например

value.split(/,|;/)
3 голосов
/ 19 февраля 2009

Используйте var result = value.split(","). Вы получите массив.

2 голосов
/ 12 мая 2011

Regex:

((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*
1 голос
/ 19 февраля 2009

Как правило, не можно проверить адреса электронной почты. Что-то, что является синтаксически допустимым, не обязательно идет куда-то, и даже если это так, будет ли оно прочитано.

И даже тогда, для покрытия всех возможных синтаксически правильных адресов (согласно применимому RFC) требуется чрезвычайно сложное регулярное выражение (см. 1-е издание «Освоение регулярных выражений» (Friedl, O'Reilly) для версий символов 4724 или 6598). и они, вероятно, не обрабатывают IDN). Например. апостроф является действительным символом в локальной части, и вы можете оставлять комментарии внутри электронного письма.

0 голосов
/ 10 февраля 2016

попробуйте

     function validateEmails(string) {
        var regex = /^([\w-\.]+@([\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;
    }

принимает в качестве разделителя запятую и точку с запятой, измените это, если вы хотите использовать только запятую в качестве разделителя

0 голосов
/ 11 сентября 2015

использовал это для php preg_match_all ()

$pattern = '/([\w+\._%-]+@[\w+\.-]+\.[\w+]{2,4}[^,;\s])/';
$text = 'abc@efg.com, efg, hij@emg.com, ak@efg asfbd@efg.com ab@sdfs.com abc+efg@pqr.com';
preg_match_all($pattern, $text, $match);
var_dump($match);

array(2) {
  [0] =>
  array(5) {
    [0] =>
    string(11) "abc@efg.com"
    [1] =>
    string(11) "hij@emg.com"
    [2] =>
    string(13) "asfbd@efg.com"
    [3] =>
    string(11) "ab@sdfs.com"
    [4] =>
    string(15) "abc+efg@pqr.com"
  }
  [1] =>
  array(5) {
    [0] =>
    string(11) "abc@efg.com"
    [1] =>
    string(11) "hij@emg.com"
    [2] =>
    string(13) "asfbd@efg.com"
    [3] =>
    string(11) "ab@sdfs.com"
    [4] =>
    string(15) "abc+efg@pqr.com"
  }
}
0 голосов
/ 19 марта 2012

Я бы добавил $.trim(result[i]) в эту функцию validateMultipleEmailsCommaSeparated, так как многие люди добавят пробел после запятой.

Конечно, это jQuery, поэтому сделайте то же самое.

0 голосов
/ 03 января 2012

Я использовал validationEngine и underscore.js, чтобы сделать это:

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

А затем украсил поле моей формы:

<input class="validate[required,funcCall[validateEmail]]" type="text" name="contact_email" id="contact_email" value=""  />
0 голосов
/ 19 февраля 2009

Как насчет разделения строки на массив и циклического прохождения по ней, пропуская только один адрес электронной почты за раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...