Javascript函数从网页中查找电子邮件地址

时间:2013-02-23 11:26:36

标签: javascript regex

我想编写一个javascript函数来读取所有电子邮件地址并使其链接。 例如,如果找到test@example.com,则将其替换为<a href="mailto:test@example.com">test@example.com</a>

我正在使用它:

document.body.innerHTML = document.body.innerHTML.replace(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi, <a href="mailto:$1">$1</a>'));

它适用于简单的电子邮件地址。

但问题是电子邮件地址是否已采用此格式:

"<a href="mailto:test@example.com">test@example.com</a>"

然后它不起作用。输出变得如此错误:

test@example.com">test@example.com

请提示我任何解决方案。所以这个功能可以正常工作。

或者使简单电子邮件成为链接的任何其他功能,如果电子邮件已经在mailto:link表单中,则不执行任何操作。

1 个答案:

答案 0 :(得分:2)

以下是一种方法,只有在电子邮件之前的字符不是>:"'时才会进行替换。它基本上是一种模仿负面观察的方式

var str = ' test@example.com <a href="mailto:test@example.com">test@example.com</a> ',
    rex = /(["'>:]?)([\w.-]+@[\w.-]+\.[\w.-]+)/gi;

str = str.replace( rex, function ( $0, $1 ) {
    return $1 ? $0 : '<a href="mailto:' + $0 + '">' + $0 + '</a>';
});

// " <a href="mailto:test@example.com">test@example.com</a> <a href="mailto:test@example.com">test@example.com</a> "

\w相当于[a-zA-Z0-9_]

要更加明确地说明何时要阻止替换,您可以将上面的rex改为

rex = /(<a href(?:(?!<\/a\s*>).)*)?([\w.-]+@[\w.-]+\.[\w.-]+)/gi;

如果电子邮件出现在<a href</a>之间,则只会阻止替换。

这些正则表达式解决方案都不是水密的,但在某些情况下它们可能已经足够好了。