尝试用从中剥离的 URL 替换 HTML <a> 标记时,我的 Ruby 代码中的 gsub 方法出现问题

Posted

技术标签:

【中文标题】尝试用从中剥离的 URL 替换 HTML <a> 标记时,我的 Ruby 代码中的 gsub 方法出现问题【英文标题】:Issue with gsub method in my Ruby code when trying to replace HTML <a> tags with the URL stripped from in it 【发布时间】:2021-06-16 10:44:23 【问题描述】:

我正在尝试实现基本替换,但我发现很难确定此处的行为。

我想用其中包含的 URL 替换标签。

这是我的代码:

require 'nokogiri'

message = "Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
<a href=\"https://www.google.com\">Test This PR</a>"

puts message.gsub(Nokogiri::html.parse(message).at('a'), Nokogiri::HTML.parse(message).at('a')['href'])

我认为输出会是:

"Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
https://www.google.com

实际输出是什么:

"Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
<a href=\"https://www.google.com\">https://www.google.com</a>"

有人可以解释为什么会发生这种情况以及我怎样才能做得更好吗?

【问题讨论】:

因为String#gsub会将第一个参数隐式转换为正则表达式:Regexp.new(Nokogiri::HTML.parse(message).at('a')) ==> /Test This PR/ (正则表达式将通过#to_str方法和Nokogiri#Node别名将参数对象隐式转换为字符串#to_str:text attribute,这意味着在你的情况下是“测试这个 PR”) 【参考方案1】:

因为Nokogiri::XML::Element 既不是字符串也不是正则表达式。坚持.to_s 有效:

puts message.gsub(
    Nokogiri::HTML.parse(message).at('a').to_s, 
    Nokogiri::HTML.parse(message).at('a')['href']
)

但是,您将竭尽全力解析 HTML,只是为了再次搜索文档,就好像您对它一无所知。此外,如果您在一条消息中有多个链接,或者如果您的锚标记未规范格式化,则会给出错误的结果 - 例如如果你有多余的空间,像这样:&lt;a href="https://www.google.com" &gt;https://www.google.com&lt;/a&gt;

为什么不让 Nokogiri 工作?

puts Nokogiri::HTML.fragment(message).tap  |doc|
  doc.css("a").each  |node|
    node.replace(node["href"])
  
.to_html

请注意,我更改了Nokogiri::HTML.fragment,因为这不是一个完整的 HTML 文档(包含 doctype 和所有内容),Nokogiri 觉得有义务添加。然后,对于每个锚节点,将其替换为其href 属性的值。

【讨论】:

这就像一个魅力。我的下一次迭代将在电子邮件中添加所有标签,并查看 gsub,但这也有效。谢谢

以上是关于尝试用从中剥离的 URL 替换 HTML <a> 标记时,我的 Ruby 代码中的 gsub 方法出现问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 从 url 中剥离域名

将所有相对 URL 替换为绝对 URL

bugku 逆向入门

用…替换()或wrap()http://name.tld/request_url?参数?

如何防止 Wordpress 在摘录中剥离 HTML 标签

Google 协作平台 HTML 框 - 剥离 Javascript