Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在ruby/rails中提取html块中的电子邮件地址_Ruby On Rails_Ruby_Regex_Html Parsing_Email - Fatal编程技术网

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

Ruby on rails 在ruby/rails中提取html块中的电子邮件地址,ruby-on-rails,ruby,regex,html-parsing,email,Ruby On Rails,Ruby,Regex,Html Parsing,Email,我正在创建一个解析器,防止垃圾邮件和从tinyMCE的文本块中获取电子邮件(因此它可能有也可能没有html标记) 我尝试过正则表达式,到目前为止,这是成功的: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i 问题是,我需要忽略所有带有mailto HREF的电子邮件地址。例如: <a href="mailto:test@mail.com">test@mail.com</a> 应仅返回第二封电子邮件添加 为了了解我在做什么

我正在创建一个解析器,防止垃圾邮件和从tinyMCE的文本块中获取电子邮件(因此它可能有也可能没有html标记)

我尝试过正则表达式,到目前为止,这是成功的:

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i
问题是,我需要忽略所有带有mailto HREF的电子邮件地址。例如:

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

应仅返回第二封电子邮件添加

为了了解我在做什么,我在一个块中反转电子邮件地址,因此上面的示例如下所示:

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

我当前的正则表达式的问题是它也替换了href中的正则表达式。有没有办法让我用一个正则表达式来做这件事?或者我必须先检查一个,然后再检查另一个?有没有一种方法可以让我只用gsub来解析邮件,或者我需要使用一些nokogiri/hpricot魔法等等来解析邮件?提前谢谢

以下是我的推荐信:

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

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

im还使用以下方法进行测试:

编辑

以下是我当前的帮助程序代码:

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
def email_模糊器(文本)
text.gsub(/\b[A-Z0-9.\uz0%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}\b/i){124; m|
m=“#{m.reverse}”
}
结束
其结果是:

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

这样行吗

/\b(?<!mailto:)[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i
/\b(?)?
(?是一个负查找,它将忽略以
mailto:


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

如果Lookback不工作,另一个选项是:

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


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

为什么不将所有匹配的电子邮件存储在一个数组中?您可以使用ruby标准库轻松做到这一点,并且(我想)它可能比向正则表达式添加更复杂的内容更快/更易于维护

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

我用rubular试过了,但上面写的是未定义(?…)序列。我认为<是罪魁祸首。它又代表什么?嗯,看起来Ruby不支持Lookbehing,根据-这很烦人。这个?我想知道,因为它也有帮助,但我没有正确的特权。无论如何,谢谢你的帮助!它使用rubular工作,但还有一个问题,我如何检查第一个捕获的组是否为mailto?我将再次将其传递给函数?这是我当前用于混淆器的代码:(见上文)对不起,我对Ruby不太熟悉。通常,当你进行regexp搜索时,它会返回一个匹配元素数组,这些元素被分成捕获的组。我也对此进行了研究,但你必须知道选择哪个组。我的目标是“动态替换”,类似的情况可能会发生:1.开始解析文本块2.哦,我看到一个电子邮件地址,请让我将其反转。3.哦,我看到另一个电子邮件地址,但这一个有一个mailto:在它之前,它必须是一个超链接。继续。4.我再次看到一封电子邮件,这次没有mailto:,再次将其反转。5.返回到步骤2,依此类推。那么,你是否有能力检查每封匹配的电子邮件并采取行动根据它包含的内容不同?我想是的。这是否意味着我收到的每封电子邮件都应该对照另一个正则表达式进行检查?或者我可以使用一个正则表达式返回一个电子邮件地址或一个附加了mailto:的电子邮件地址。然后做一个if语句来决定是否撤销它?如上面函数中所述,我将只替换t他用倒排的邮件发送邮件,这意味着如果我把它们放在一个数组中,我必须记住我从文本博客的哪个部分得到它们。