JavaScript, регулярное выражение: Как получить почтовый адрес в mailto: ссылки

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

Скажите, если у меня есть ссылка, как ...

<a href="mailto:[email protected],[email protected]">Some msg</a>

Регулярное выражение должно дать мне почтовые адреса в mailto: ссылка - [email protected], [email protected]. Он также должен поддерживать такие ссылки, как

<a href="mailto:[email protected]?subject=Comments from MailTo Syntax Page">
<a href="mailto:[email protected]?body=I am having trouble finding information on">
<a href="mailto:[email protected]?subject=MailTo Comments&[email protected]&[email protected]">

Для ссылки типа

<a href="mailto:value">tell a friend</a>

Я бы передал value и функцию и получил бы ассоциативный массив адресов электронной почты и других полей, переданных в строке запроса.


person vikmalhotra    schedule 05.03.2012    source источник


Ответы (3)


Разбор URL-адресов и особенно их строк запросов не является задачей для регулярных выражений. Вы можете использовать подходящую библиотеку для разбора URL или просто разбор строки запроса.

person Domenic    schedule 05.03.2012
comment
Действительно? сотни строк кода, чтобы вытащить адрес электронной почты? - person Petah; 30.01.2013
comment
Да. Любой, кто говорит иначе, не понимает всей сложности URL-адресов. - person Domenic; 30.01.2013

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

function getEmails(str) {
// returns a list of email addresses in 'str'
    var tags = str.match(/<a href=('|")mailto:(.*?)\1(.*?)>/gi);
    var res = [];
    if (!tags.length) return res;
    for (var i = 0; i < tags.length; i++) {
        tags[i] = tags[i].replace(/^<a href=('|")mailto:(.+?)(\?[^\1]*)?\1>$/,'$2');
        var arr = tags[i].replace(/\s/g,'').split(',');
        for (var j = 0; j < arr.length; j++) res.push(arr[j]);
    }
    return res;
}

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

person inhan    schedule 05.03.2012
comment
Я не знаю, удовлетворяет ли это потребности ОП, но это именно то, что мне нужно. Спасибо! (Также спасибо, что не опубликовали ответ «Не делайте этого» :) - person Claytronicon; 02.03.2018

Если вы знаете, что делаете:

var href = 'mailto:[email protected]?subject=My+Subject&body=My+Body';

function getMailto(s) {
    var r = {};
    var email = s.match(/mailto:([^\?]*)/);
            email = email[1] ? email[1] : false;
  var subject = s.match(/subject=([^&]+)/);
            subject = subject ? subject[1].replace(/\+/g,' ') : false;
    var body = s.match(/body=([^&]+)/);
            body = body ? body[1].replace(/\+/g,' ') : false;

  if(email) {r['email'] = email;}
  if(subject) {r['subject'] = subject;}
  if(body) {r['body'] = body;}

  return r;
}

console.log(getMailto(href));

Демо: https://jsfiddle.net/l2aelba/qov9wpk5/

person l2aelba    schedule 14.01.2016
comment
+1 за добавление решения, а не за то, что вы не должны этого делать! , несмотря на то, что имя метода в console.log несовместимо и требует строкового преобразования. - person Claytronicon; 02.03.2018
comment
-1 Этого синтаксического анализа совершенно недостаточно для декодирования URL в целом. Например, если тема содержит восклицательный знак, она будет закодирована как %21, которую ваш код оставит как есть. - person Anko; 07.08.2018
comment
@Anko Это просто использование на свой страх и риск! - person l2aelba; 08.08.2018