在我的 Ruby 代码中尝试用 URL 替换 HTML <a> 标签时出现 gsub 方法问题
Issue with gsub method in my Ruby code when trying to replace HTML <a> tags with the URL stripped from in it
我正在尝试实现基本替换,但我发现很难确定此处的行为。
我想用其中包含的 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>"
有人可以解释为什么会这样吗以及我如何才能做得更好?
因为 Nokogiri::XML::Element
既不是字符串也不是正则表达式。粘贴 .to_s
有效:
puts message.gsub(
Nokogiri::HTML.parse(message).at('a').to_s,
Nokogiri::HTML.parse(message).at('a')['href']
)
但是,您将费尽心思地解析 HTML 只是为了再次搜索该文档,就好像您对此一无所知一样。此外,如果您在一封邮件中有多个链接,或者如果您的锚标签格式不规范,它也会给出错误的结果——例如如果你有额外的 space,像这样:<a href="https://www.google.com" >https://www.google.com</a>
为什么不让 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
属性的值。
我正在尝试实现基本替换,但我发现很难确定此处的行为。
我想用其中包含的 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>"
有人可以解释为什么会这样吗以及我如何才能做得更好?
因为 Nokogiri::XML::Element
既不是字符串也不是正则表达式。粘贴 .to_s
有效:
puts message.gsub(
Nokogiri::HTML.parse(message).at('a').to_s,
Nokogiri::HTML.parse(message).at('a')['href']
)
但是,您将费尽心思地解析 HTML 只是为了再次搜索该文档,就好像您对此一无所知一样。此外,如果您在一封邮件中有多个链接,或者如果您的锚标签格式不规范,它也会给出错误的结果——例如如果你有额外的 space,像这样:<a href="https://www.google.com" >https://www.google.com</a>
为什么不让 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
属性的值。