如何删除HTML节点之间的空格?
我正在尝试从
标记之间的HTML片段中删除空格
Foo Bar
bar bar bar
bla
如您所见,
标记之间总是有空格。
问题是在将字符串保存到我的数据库时,空格会创建
标记。 像strip
或gsub
这样的方法只删除节点中的空格,导致:
FooBar
barbarbar
bla
而我想要:
Foo Bar
bar bar bar
bla
我正在使用:
- Nokogiri 1.5.6
- Ruby 1.9.3
- 轨道
更新:
偶尔会有
标签的子节点产生同样的问题:之间有空格
示例代码
注意:代码通常在一行中,我重新格式化它,因为它是无法忍受的,否则……
Selling an Appartment
-
beautiful apartment!
-
near the train station
. . .
-
10 minutes away from a shopping mall
-
nice view
. . .
我怎么剥去那些白色空间呢?
解
事实certificate,我搞砸了使用gsub
方法,并没有进一步调查使用gsub
与regex
的可能性…
简单的解决方案是添加
data = data.gsub(/>\s+<")
它删除了所有不同节点之间的空白…正则表达式!
这就是我编写代码的方式:
require 'nokogiri' doc = Nokogiri::HTML::DocumentFragment.parse(<Foo Bar bar bar bar
bla
EOT doc.search('p, ul, li').each { |node| next_node = node.next_sibling next_node.remove if next_node && next_node.text.strip == '' } puts doc.to_html
它导致:
Foo Bar
bar bar bar
bla
打破它:
doc.search('p')
仅查找文档中的
节点。 Nokogiri从search
返回NodeSet,如果没有匹配则返回nil。 代码循环遍历NodeSet,依次查看每个节点。
next_node = node.next_sibling
获取指向当前
节点之后的下一个节点的指针。
next_node.remove if next_node && next_node.text.strip == ''
如果下一个节点不是nil,则next_node
从DOM中删除当前的next_node
,并且当剥离时,其文本不为空,换句话说,如果节点只有空格。
如果所有文本节点都应从文档中剥离,则还有其他技术可以仅定位TextNodes。 这是有风险的,因为它最终会删除标签之间的所有空白,导致连续的句子和加入的单词,这可能不是你想要的。
第一个解决方案可以是删除空文本节点,为您的确切情况快速执行此操作可以是:
require 'nokogiri' doc = Nokogiri::HTML("Foo Bar
bar bar bar
bla
") doc.css('body').first.children.map{|node| node.to_s.strip}.compact.join
这对于嵌套元素不起作用,但应该为您提供良好的开始路径。
更新:
你可以实际优化一点:
require 'nokogiri' doc = Nokogiri::HTML::DocumentFragment.parse("Foo Bar
bar bar bar
bla
") doc.children.map{|node| node.to_s.strip}.compact.join
data.squish做同样的事情,并且更具可读性。