代码之家  ›  专栏  ›  技术社区  ›  corroded

在Ruby/Rails中提取HTML块中的电子邮件地址

  •  0
  • corroded  · 技术社区  · 16 年前

    我正在创建一个解析器,以防止垃圾邮件和从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>
    

    我当前的regex的问题是它也替换了href中的regex。有没有办法用一个regex来做这个?或者我必须先检查一个然后另一个?有没有一种方法可以让我通过使用gsub来完成这个任务,或者我需要使用一些nokogiri/hpricot magicks,以及什么不能解析mailtos?事先谢谢!

    以下是我的推荐信:

    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 回复  |  直到 16 年前
        1
  •  0
  •   serg    16 年前

    如果lookback不起作用,另一个选择是:

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

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

        2
  •  0
  •   John Y    16 年前

    这行吗?

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

    这个 (?<!mailto:) 是一个否定的lookback,它将忽略以 mailto:

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

        3
  •  0
  •   Damien Wilson    16 年前

    为什么不把所有匹配的电子邮件存储在一个数组中 remove any duplicates ?使用Ruby标准库可以很容易地做到这一点,而且(我想)它可能比增加regex的复杂性更快/更易于维护。

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