链接未链接的电子邮件地址

3

我目前正在使用以下正则表达式匹配电子邮件地址,并将它们作为 mailto 链接连接:

/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,64})/

然而,我不想将已经作为mailto链接或在现有链接中(例如index.php?email=example@example.com)链接的任何内容再次链接,否则链接会变得非常混乱,如下所示:

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

更新

以下是我正在使用的PHP示例,用于查找电子邮件地址(抱歉,我认为这是必需的):

$input = "example@example.com<br><br><a href='mailto:example@example.com'>test email</a><br><br><a href='mailto:example@example.com'>example@example.com</a>";

$output = preg_replace("/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,64})/i", "<a href='mailto:$1'>$1</a>", $input);

//output
<a href="mailto:example@example.com">example@example.com</a><br><br><a mailto:example@example.com'="" href="mailto:&lt;a href=">example@example.com</a>'&gt;test email<br><br><a mailto:example@example.com'="" href="mailto:&lt;a href=">example@example.com</a>'&gt;<a href="mailto:example@example.com">example@example.com</a>

更新 2

我还有一个正则表达式的问题(如果可能) - 我也有以下正则表达式,使所有链接都指向一个新窗口,然而,我不想让任何链接到 mailto 的东西去新窗口 - 是否有可能不指向 mailto 链接?

$output = preg_replace("/<(a)([^>]+)>/i", "<\\1 target=\"_blank\"\\2>", str_replace('target="_blank"', '', $output));

你需要提供实际执行链接的代码片段。简单的正则表达式模式是不够的。 - Nikola Malešević
之前没有考虑到这是必需的(因为正则表达式就是正则表达式),现在已经包含了。 - MrJ
并非所有的正则表达式都是相同的。不同的编程语言允许不同的功能。例如,.NET中支持后行断言,但JavaScript中不支持。这就是为什么我们需要知道您使用的编程语言来处理正则表达式的原因。 - Nikola Malešević
1个回答

3

这个正则表达式怎么样?

/((?<!mailto:|=|[a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.‌​-]+\.[a-zA-Z]{2,64}(?![a-zA-Z]|<\/[aA]>))/

1
我尝试过这个,但它似乎没有匹配到任何东西,实际上,由于某种原因,它似乎删除了所有内容。对于 $data = "example@example.com"; echo preg_replace("/((?<!(?:mailto:|=)[a-zA-Z0-9._%+-]*)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,64})/", "<a href='mailto:$1'>$1</a>", $data); 这段代码,它可以匹配英国地址,所以不确定问题出在哪里... - MrJ
抱歉,我已经更新了另一个版本的正则表达式答案。请尝试一下。 - Nikola Malešević
+1,谢谢!无论如何,如果使用http://gskinner.com/RegExr/进行检查,它都可以工作,但是使用javascript尝试时,我会收到错误消息:new RegExp(/((?<!mailto:|=|[a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.‌​-]+.[a-zA-Z]{2,64}(?![a-zA-Z]|</[aA]>))/, "g");错误:SyntaxError:无效的正则表达式:(regexp):无效的组。可能是什么原因? - ianaz
1
@ianaz OP正在使用preg_replace,它支持反向引用((?<!lookup_text))。JavaScript不支持这个功能。 - Nikola Malešević
你能帮我把那个转化成JS的替代方法吗? - ianaz
@ianaz 如果您有具体的问题,请创建一个新的问题,让其他人可以回答。如果您是MrJ,请登录该帐户并更新此问题。我很乐意尝试解决它。 - Nikola Malešević

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接