2017-05-24 41 views
0

我的客户端数据中有<br>标记,我需要在我的Rails API中用'\ n \ n'代替React Native应用程序。Ruby - gsub br标记为 n n用于API,但包括任何空格

有时在<br>标记之前或之后有空格,或两者都有。

我正在寻找一个gsub说“任何<br>标签,并且还之前或之后包含任何空白,用‘\ n \ n’取代

现在我做:

module ApiHelper 
    def parse_newlines(string) 
    string = string.gsub('<br>', '\n\n') 
    string = string.gsub(' <br>', '\n\n') 
    string = string.gsub('<br> ', '\n\n') 
    string = string.gsub(' <br> ', '\n\n') 
    end 
end 

有什么清洁

编辑:谢谢所有我想要同时接受加文的和铁皮人的答案...加文,因为他给了我这样一个向下和肮脏的解决方案,但铁皮人伟大的/深入的解释更强大的方式usi ng Nokogiri ...

2nd编辑:我收回。锡人...使用Nokogiri实际上更具可读性。你在评论中使用正则表达式的观点是有效的。最后你的代码更容易理解。给你接受的答案,尽管我现在正在使用加文的答案。

+0

请阅读“[mcve]”。提供一个工作,最小的代码示例以及演示问题的必要输入(最小的HTML)。要求我们创建HTML会浪费我们的时间,并在帮助您和其他人时帮助我们放慢速度。可能碰到'< br>','
','
'或更糟。不要使用正则表达式或字符串操作来更改HTML;它会让你疯狂。而是使用解析器。 –

回答

1

当弄乱HTML或XML时,最好使用解析器。我开始:

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT) 
<p>this<br>is<br> some <br> 
text<br>and<br >some<br/>more</p> 
EOT 

doc.search('br').each { |br| br.replace("\n\n") } 
doc.to_html 
# => "<p>this\n" + 
# "\n" + 
# "is\n" + 
# "\n" + 
# " some \n" + 
# "\n" + 
# "\n" + 
# "text\n" + 
# "\n" + 
# "and\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "more</p>\n" 

在通过浏览器显示的HTML空白是由浏览器吞并因此在空间不足,或者除非你<pre>标签包装它多收益将减少为单个空格或一行或者做类似的事情。

如果你绝对需要前后剥离空间,您要插入新行,我会使用一个额外的步骤:

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT) 
<p>this<br>is<br> some <br> 
text<br>and<br >some<br/>more</p> 
EOT 

doc.search('p').each do |p| 
    p.inner_html = p.inner_html.gsub(/ +</, '<').gsub(/> +/, '>') 
end 

doc.to_html 
# => "<p>this<br>is<br>some<br>\n" + 
# "text<br>and<br>some<br>more</p>\n" 

doc.search('br').each { |br| br.replace("\n\n") } 
doc.to_html 
# => "<p>this\n" + 
# "\n" + 
# "is\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "\n" + 
# "text\n" + 
# "\n" + 
# "and\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "more</p>\n" 

注:从技术上讲,<br>相当于一个“\ n“,而不是”\ n \ n“。 <p>将是两条新线,因为这构成了一个段落。

+0

感谢所有这些细节!是的,我意识到我需要两条线而不是一条线。数据来自客户端的word/excel,并且他们有这些¶符号,我错误地用一个
标签首先替换了这些符号。然后意识到我无法使用
标签作为反应原生,我需要使用/ n。然后意识到我实际上需要两个/ n。 – gregblass

+0

Nokogiri看起来非常棒。我可能不得不稍后再做一些更健壮的分析,这会很有帮助。非常感激! – gregblass

2

这会做到这一点:

module ApiHelper 
    def parse_newlines(string) 
    # Handles <br>, <br/>, <br /> 
    string.gsub(/\s*<br\s*?\/?>\s*/, "\n\n") 
    end 
end 

# irb 
> parse_newlines("  <br>  ") 
=> "\n\n" 
> parse_newlines("  <br />  ") 
=> "\n\n" 
> parse_newlines("<br />") 
=> "\n\n" 
1

你可以尝试使用:

string = 'Lorem <br> Ipsum' 
puts string.gsub(/\s(<br>)\s/, '\n\n') 
# => Lorem\n\nIpsum 
puts string.gsub(/\s(<br>)\s/, "\n\n") 
# Lorem 
# 
# Ipsum 

并注意'\n\n'"\n\n"之间的差异。

1
module ApiHelper 
    def parse_newlines(string) 
    string.gsub(/\s*<br>\s*/, "\n\n") 
    end 
end 
+0

检查http://rubular.com/处理正则表达式;) –