4

我尝试匹配电子邮件地址,但前提是它们前面没有“mailto:”。我试试这个正则表达式:

"/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

针对这个字符串: '<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com '

我希望只抓到'otheremail@domain.com',但我也收到'omeemail@domain.com'- 看到失踪's'。我想知道这里有什么问题。在后向断言之后我不能有一个正常的正则表达式吗?

我在 PHP 中的整个示例如下所示:

$testString = '<a href="mailto:someemail@domain.com">EMAIL</a>  ...   otheremail@domain.com ';
$pattern = "/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/";
preg_match_all($pattern, $testString, $matches);
echo('<pre>');print_r($matches);echo('</pre>');

谢谢!

4

3 回答 3

5

因为在s有一个与您的正则表达式匹配的字符串之后omeemail@domain.com,并且因为s它几乎不mailto:匹配。在大多数情况下,在其中获取单词边界将起作用:

改变:

(?<!mailto:)

到:

(?<!mailto:)\b

附带说明:使用 example.com 作为示例,domain.com 归一家实际公司所有。

于 2011-07-21T23:22:50.017 回答
2

它尝试匹配“someemail@”,但失败了,因为它的前面紧跟着“mailto:”,所以它尝试匹配“omeemail@”,它成功了,因为它前面没有紧跟着“mailto:”。

编辑:它认为更改(?<!mailto:)(?!mailto:)效果最好。

@Wrikken:正则表达式允许“。” 在电子邮件地址中,但如果您有,(?<!mailto:)\b则“mailto:some.email@”将从“email@”匹配。

于 2011-07-21T23:27:50.307 回答
0

因此,根据@Wrikken 和@MRAB 的提示,我们提出了最终的有效正则表达式:
"/(?<!mailto:)(?<=^|[^A-Za-z0-9_.+@-])[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

重要的是在消极的后视之后使用前瞻作为“电子邮件边界”。

于 2011-07-22T16:15:49.167 回答