正则表达式,以便查找不在标记中的电子邮件

时间:2017-04-04 14:51:03

标签: php regex email

所以我想创建一个只能找到标记值之外的电子邮件地址的正则表达式(在PHP中)。

found@test.com
found@test.com found@test.com
<a href="mailto:notFound@test.com">found@test.com</a>
<meta name="email" content="notFound@test.com" />

当电子邮件在<...>内时,应该。因为在这种情况下,它可能在href值内,或类似的东西 但是应该找到所有不在<...>标签内的地址,然后替换为字体awesome @而不是正常字体。

目前,我在不检查<...>的情况下替换所有电子邮件:
搜索:/([A-Z0-9a-z._%+-]+)@([A-Za-z0-9.-]+\.[A-Za-z]{2,64})/si
替换为:$1<i class="fa fa-at" aria-hidden="true"></i>$2

但是,我如何使用否定前瞻来检查,>之前的左边是<,另一边是右边的?{1}}?

我试图在开头添加(?![^<]*>),但它似乎有效。但正则表达式结束的反面是什么?这真的是解决方案吗?我发现尝试和错误,我不知道这是否保存使用。

此处测试:https://regex101.com/r/lhqQiN/3

问候并感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

解决问题的一种优雅方式(支持PCRE时,即在PHPPython等),是使用(*SKIP)(*FAIL)

<[^<>]+>(*SKIP)(*FAIL)|\S+@\S+

这表示:执行匹配<>之间的任何内容,然后将其丢弃。替代方案以非常简单的格式匹配电子邮件地址 见a demo on regex101.com

<小时/> 在PHP中,这将是:

<?php
$regex = '~<[^<>]+>(*SKIP)(*FAIL)|\S+@\S+~';
$new_string = preg_replace($regex, '<font>$0</font>', $your_html_string_here);
?>

请参阅a demo on ideone.com