Ruby-gsub br标记为\ n \ n用于API,但包括任何空格

时间:2017-05-24 15:24:54

标签: ruby regex gsub

我的客户端数据中有<br>个标记,我需要用&#39; \ n \ n&n;在我的Rails API中,用于React Native应用程序。

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

我正在寻找一个gsub来说明&#34;任何<br>标记,并且还包括之前或之后的任何空格,替换为&#39; \ n \ n& #39;

现在我正在做:

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

有什么更清洁的东西吗?

编辑:谢谢大家。我想接受Gavin和Tin Man的答案...... Gavin,因为他给了我一个肮脏的解决方案,但是Tin Man在一个更强大的方式上使用了这么好的/深入的解释引入nokogiri ...

第二次编辑:我收回了它。锡人...使用Nokogiri实际上更具可读性。您在评论中使用正则表达式的论点是有效的。最后,您的代码更容易理解。即使我现在正在使用Gavin,也会给你接受的答案。

4 个答案:

答案 0 :(得分: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 :(得分: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"之间的区别。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

开始
DatePicker.Value = CDate(ds.Tables("MasterMB4").Rows(i).Item("ProdDate"))

浏览器显示的HTML中的空格被浏览器吞噬,因此空间可以运行,或者多个返回将减少到单个空格或单行,除非用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" 标签包装它或做类似的事情。 / p>

如果您在插入新线之前和之后绝对需要去除空格,我会使用额外的步骤:

<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" 相当于单个&#34; \ n&#34;而不是&#34; \ n \ n&#34;。 <br>将是两个新行,因为它构成一个段落。