dav*_*son 6 ruby ruby-on-rails nokogiri ruby-on-rails-3
我正在尝试从<p>标签之间的 HTML 片段中删除空格
<p>Foo Bar</p> <p>bar bar bar</p> <p>bla</p>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,标签之间总是有一个空格<p> </p>。
<br>问题是,将字符串保存到我的数据库时,空格会创建标签。strip诸如or 之类的方法gsub仅删除节点中的空白,从而导致:
<p>FooBar</p> <p>barbarbar</p> <p>bla</p>
Run Code Online (Sandbox Code Playgroud)
而我想要的是:
<p>Foo Bar</p><p>bar bar bar</p><p>bla</p>
Run Code Online (Sandbox Code Playgroud)
我在用着:
有时,标签的子节点会<p>产生相同的问题:之间有空格
示例代码
注意:代码通常在一行中,我重新格式化了它,因为否则它会难以忍受......
<p>
<p>
<strong>Selling an Appartment</strong>
</p>
<ul>
<li>
<p>beautiful apartment!</p>
</li>
<li>
<p>near the train station</p>
</li>
.
.
.
</ul>
<ul>
<li>
<p>10 minutes away from a shopping mall </p>
</li>
<li>
<p>nice view</p>
</li>
</ul>
.
.
.
</p>
Run Code Online (Sandbox Code Playgroud)
我该如何去除这些空白呢?
事实证明,我使用方法搞砸了,没有进一步研究使用withgsub的可能性......gsubregex
简单的解决方案是添加
data = data.gsub(/>\s+</, "><")
Run Code Online (Sandbox Code Playgroud)
它删除了所有不同类型节点之间的空白...正则表达式!
这就是我编写代码的方式:
require 'nokogiri'
doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<p>Foo Bar</p> <p>bar bar bar</p> <p>bla</p>
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
Run Code Online (Sandbox Code Playgroud)
其结果是:
<p>Foo Bar</p><p>bar bar bar</p><p>bla</p>
Run Code Online (Sandbox Code Playgroud)
分解一下:
doc.search('p')
Run Code Online (Sandbox Code Playgroud)
仅查找<p>文档中的节点。Nokogiri 从 中返回一个 NodeSet search,如果没有匹配则返回 nil。该代码在 NodeSet 上循环,依次查看每个节点。
next_node = node.next_sibling
Run Code Online (Sandbox Code Playgroud)
获取指向当前节点之后的下一个节点的指针<p>。
next_node.remove if next_node && next_node.text.strip == ''
Run Code Online (Sandbox Code Playgroud)
next_node.removenext_node如果下一个节点不为零并且其文本在剥离时不为空,换句话说,如果该节点只有空格,则从 DOM 中删除当前节点。
如果应从文档中删除所有 TextNode,则还有其他技术可以仅定位 TextNode。这是有风险的,因为它最终可能会删除标签之间的所有空白,从而导致连续的句子和连接的单词,这可能不是您想要的。
| 归档时间: |
|
| 查看次数: |
6786 次 |
| 最近记录: |