所以我在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或其他任务这么简单。)
答案 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 world
到hello world
):
"hello world".squeeze(" ") # => "hello world"
挤压参数是要挤压的字符。
编辑:我误解了你的问题,抱歉。这会
我现在正在研究解决方案。
答案 3 :(得分:0)
xml.squish.gsub /(> <)/, '><'
甚至比上面更短。
PS我喜欢这些有趣的面孔。