如何在Nokogiri的HTML代码中找到电子邮件地址?

时间:2012-11-27 13:10:09

标签: ruby-on-rails ruby regex nokogiri

如何使用Nokogiri在HTML代码中找到电子邮件地址? 我想我需要使用正则表达式,但不知道如何。

示例代码

    <html>
    <title>Example</title>
    <body>
    This is an example text.
    example@example.com
    </body>
    </html>

当有一个关于mail_to的href时,有一个答案涵盖案例,但这不是我的情况。电子邮件地址有时在链接中,但并非总是如此。

由于

2 个答案:

答案 0 :(得分:6)

如果您只是尝试从恰好是HTML的字符串中解析电子邮件地址,则不需要Nokogiri。

html_string   = "Your HTML here..."
email_address = html_string.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i)[0]

这不是一个完美的解决方案,因为构成“有效”电子邮件地址的RFC是非常宽松。这意味着您遇到的大多数正则表达式(包括上面的表达式)都没有考虑边缘情况有效地址。例如,根据RFC

$A12345@example.com

是有效的电子邮件地址,但不会与上述正则表达式匹配。

答案 1 :(得分:1)

只需在HTML字符串上使用正则表达式,不需要Nokogiri(如@deefour建议的那样)。对于正则表达式本身,我建议rails autolink gem使用的那个(称为AUTO_EMAIL_RE):

/[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/

这应该能够捕获更严格的正则表达式过滤器错过的边缘情况:

RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/

RE.match('abc@example.com')
#=> #<MatchData "abc@example.com">

RE.match('$A12345@example.com')
#=> #<MatchData "$A12345@example.com">

请注意,如果您确实要匹配所有有效的电子邮件地址,那么您需要mighty big regex