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

时间:2010-05-06 14:56:30

标签: ruby-on-rails ruby regex html-parsing email-integration

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

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

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

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

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

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

要了解我正在做什么的背景,我正在反转块中的电子邮件地址,以便上面的示例如下所示:

<a href="mailto:test@mail.com">moc.liam@tset</a>

我现在的正则表达式的问题是它也取代了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.-]+\.[A-Z]{2,4}\b/i) { |m|
    m = "<span class='anti-spam'>#{m.reverse}</span>"
  }
end

结果如下:

<a target="_self" href="mailto:<span class='anti-spam'>moc.liamg@tset</span>"><span class="anti-spam">moc.liamg@tset</span></a>

3 个答案:

答案 0 :(得分:0)

这会有用吗?

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

(?<!mailto:)是一个负面的背后隐藏,会忽略以mailto:开头的所有匹配

遗憾的是,我没有设置Ruby,但是当我测试它时它与PHP一起工作......

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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