【问题标题】:JavaScript, regex: How to fetch mail address in mailto: linksJavaScript,正则表达式:如何在 mailto 中获取邮件地址:链接
【发布时间】:2012-03-22 13:37:33
【问题描述】:

是否有一个 jquery 插件或者可能是一个正则表达式,可用于 mailto: 链接的查询字符串中的所有字段。它应该支持mailto syntax

如果我有类似...的链接,请说

<a href="mailto:astark1@unl.edu,id@internet.node">Some msg</a>

正则表达式应该给我 mailto 中的邮件地址:链接 - astark1@unl.eduid@internet.node。它还应该支持像

这样的链接
<a href="mailto:astark1@unl.edu?subject=Comments from MailTo Syntax Page">
<a href="mailto:astark1@unl.edu?body=I am having trouble finding information on">
<a href="mailto:astark1@unl.edu?subject=MailTo Comments&cc=ASTARK1@UNL.EDU&bcc=id@internet.node">

对于类似的链接

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

我会传递value 和函数,并获得一个电子邮件地址的关联数组和查询字符串中传递的其他字段。

【问题讨论】:

    标签: javascript regex mailto


    【解决方案1】:

    如果你知道自己在做什么:

    var href = 'mailto:hello@world.com?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/

    【讨论】:

    • +1 用于添加解决方案,而不是说您不应该这样做! ,虽然console.log中的方法名不一致,需要字符串化。
    • -1 这个解析对于URL decoding一般来说是完全不够的。例如,如果主题包含感叹号,它将被编码为%21,您的代码将保持原样。
    • @Anko 这只是“使用风险自负!”
    【解决方案2】:

    解析 URL,尤其是它们的查询字符串,不是正则表达式的工作。你可以使用a proper URL-parsing library 或者只是一个query string parsing one

    【讨论】:

    • 真的吗?数百行代码提取一个电子邮件地址?
    • 是的。任何说其他话的人都不了解 URL 的全部复杂性。
    【解决方案3】:

    我不确定这有多准确,但如果您觉得有必要使用正则表达式,它可能会得到改进。

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

    顺便说一句,我不确定你在最后一部分的意思,所以我试图回答第一部分。

    【讨论】:

    • 我不知道这是否满足 OP 的需求,但这正是我所追求的。谢谢! (也感谢您没有发布“不要这样做”的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2011-07-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多