我正在创建一个解析器来阻止来自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
我也正在使用它进行测试:
修改的
这是我目前的帮助代码:
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>
答案 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"]