我想编写一个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表单中,则不执行任何操作。
答案 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>
之间,则只会阻止替换。
这些正则表达式解决方案都不是水密的,但在某些情况下它们可能已经足够好了。