在ruby / rails中的html块中提取电子邮件地址

我正在创建一个解析器来防止来自tinyMCE的文本块中的垃圾邮件和收集电子邮件(所以它可能有也可能没有html标签)

我已经尝试了正则表达式,到目前为止这已成功:

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}\b/i 

问题是,我需要忽略mailto hrefs的所有电子邮件地址。 例如:

 test@mail.com 

应该只返回第二封电子邮件添加。

为了获得我正在做的事情的背景,我正在反转块中的电子邮件地址,所以上面的例子看起来像这样:

 moc.liam@tset 

我目前的正则表达式的问题是它也取代了href中的那个。 有没有办法让我用一个正则表达式做到这一点? 或者我必须检查一个然后另一个? 有没有办法让我这样做只是通过使用gsub或我必须使用一些nokogiri / hpricot magicks和什么来解析mailtos? 提前致谢!

这是我的参考btw:

so.com/questions/504860/extract-email-addresses-from-a-block-of-text

so.com/questions/1376149/regexp-for-extracting-a-mailto-address

我也用这个测试:

http://rubular.com/

编辑

这是我目前的帮助代码:

 def email_obfuscator(text) text.gsub(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}\b/i) { |m| m = "#{m.reverse}" } end 

结果如下:

 <a target="_self" href="mailto:moc.liamg@tset">moc.liamg@tset 

如果lookbehind不起作用的另一个选择:

/\b(mailto:)?([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4})\b/i

这将匹配所有电子邮件,然后您可以手动检查第一个捕获的组是否是“mailto:”然后跳过此匹配。

这会有用吗?

 /\b(? 

(?是一个负面的lookbehind,它将忽略以mailto:开头的任何匹配mailto:

不幸的是,我没有在工作中设置Ruby,但是当我测试它时它与PHP一起工作...

为什么不将所有匹配的电子邮件存储在一个数组中并删除任何重复的邮件? 您可以使用ruby标准库轻松完成此操作(我想)它可能比为正则表达式添加更多复杂性更快/更可维护。

 emails = ["email_one@example.com", "email_one@example.com", "email_two@example.com"] emails.uniq # => ["email_one@example.com", "email_two@example.com"]