使用ruby从html文档中删除空格

时间:2010-06-19 18:40:07

标签: html xml ruby

所以我在ruby中有一个类似

的字符串
str = "<html>\n<head>\n\n  <title>My Page</title>\n\n\n</head>\n\n<body>" +
      "  <h1>My Page</h1>\n\n<div id=\"pageContent\">\n  <p>Here is a para" +
      "graph. It can contain  spaces that should not be removed.\n\nBut\n" +
      "line breaks that should be removed.</p></body></html>"

如何仅使用原生Ruby删除标记之外的所有空格(空格,制表符和换行符)/不在包含<p>内容的标记内?

(我想避免使用XSLT或其他任务这么简单。)

4 个答案:

答案 0 :(得分:9)

str.gsub!(/\n\t/, " ").gsub!(/>\s*</, "><")

第一个gsub!用空格替换所有换行符和制表符,第二个删除标记之间的空格。

你的标签内最终会有多个空格,但如果你刚删除了所有\n\t,你会得到类似“不被删除。禁止破坏”的内容,这不是很可读。另一个正则表达式或前面提到的.squeeze(" ")可以解决这个问题。

答案 1 :(得分:7)

讨厌关于regexen的分裂,但其他答案都没有严格正确。这将有效:

str.gsub(/>\s*/, ">").gsub(/\s*</, "<")

显式转换换行符是不必要的,因为/\s/匹配包括换行符在内的所有空白字符。其他答案中的regexen并不严格正确,因为它们的regexen无法匹配"\r"<p> foo bar </p>在Windows的行末使用,并将显示在电子邮件中。

我的广告系列也会将<p>foo bar</p>转换为{{1}},但您可能不希望这样。

答案 2 :(得分:1)

您可以使用String#squeeze将所有空格字符组压缩到一个空格(即hello worldhello world):

"hello     world".squeeze(" ")  # => "hello world"

挤压参数是要挤压的字符。

编辑:我误解了你的问题,抱歉。

这会

  • 删除标记内的连续空格
  • 将个别空格留在标记之外

我现在正在研究解决方案。

答案 3 :(得分:0)

xml.squish.gsub /(> <)/, '><'

甚至比上面更短。

PS我喜欢这些有趣的面孔。