我正在使用nokogiri读取文件的内容并执行一些替换操作。最后,我使用doc.to_s.将内容返回为字符串
我已经将代码简化为如下
html_string = '<a href="[foo]">foo</a>'
doc = Nokogiri::HTML(html_string)
doc.to_s
我得到的输出是
<a href="%5Bfoo%5D">foo</a>
我想要的是巧妙地保留方括号。请注意,当方括号不是HTML标记的属性时,它们不会被编码。
有什么想法可以让我绕过这件事吗?
我不认为有什么方法可以阻止Nokogiri这样做,因为Nokogiri是为了生成正确的HTML输出而设计的。我能想到的最好的解决方案是对Nokogiri的输出进行后处理:
doc_str = '<a href="%5Bfoo%5D">foo</a>'
doc_str.gsub!( /%5B(.+?)%5D/i, '[1]' )
# => <a href="[foo]">foo</a>
我希望这会有所帮助。
或者您可以做得更简单。
CGI.unescape(doc.to_s)
我一直在研究一个simliar问题,尽管方括号在hrefs中不是有效的,但也有使用方括号的情况。在我的情况下,我需要保留它们以与客户的系统兼容。
2有用的事实:
1-Nokogiri在将文档转换为文本时更正HREF。如果你加载一个html片段并查看href,你会发现方括号就在那里。
2-删除方括号只适用于href属性,其他属性中也允许删除方括号。例如数据原始href
因此,如果加载文档,然后复制href属性,就可以保留原始属性。您仍然需要对最终文本进行后期处理,以便将数据原始href转换回href。
一个例子(你可以在irb中尝试)
require 'nokogiri'
doctext = '<html><body><a href="[my dodgy href]">link text</a></body></html>'
doc = Nokogiri.HTML(doctext)
a_tag = doc.css('a')[0]
a_tag['data-raw-href'] = a_tag['href']
doc.to_s
收益率:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<a href="%5Bmy%20dodgy%20href%5D" data-raw-href="[my dodgy href]">link text</a>
</body></html>