我的客户端数据中有<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,也会给你接受的答案。
答案 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>
将是两个新行,因为它构成一个段落。