\ n到多个\ n到<p>问题</p>

时间:2011-04-22 10:44:26

标签: ruby-on-rails ruby regex

  1. 我使用bbruby gem用btml替换bbcode中的文本。
  2. 它将\r\n \n替换为<br>,将\r\n \n替换为<p>
  3.  # https://github.com/cpjolicoeur/bb-ruby/blob/master/lib/bb-ruby.rb
    
     def simple_format(text)
      start_tag = '<p>'
      text = text.to_s.dup
      text.gsub!(/\r\n?/, "\n")                     # \r\n and \r => \n
      text.gsub!(/\n\n+/, "</p>\n\n#{start_tag}")   # 2+ newline  => paragraph
      text.gsub!(/([^\n]\n)(?=[^\n])/, '\1<br />')  # 1 newline   => br
      text.insert 0, start_tag
      text << "</p>"
    end
    

    看起来很好!

    但是当文字包含<table>时,它会变得很糟糕!我希望在\n位于表格标记时避免替换\n,并且在bbruby替换它之前我尝试替换表中的\n,但它不起作用。

3 个答案:

答案 0 :(得分:1)

text.gsub!(/\r\n?/, "\n")

应该是

text.gsub!(/\r?\n/, "\n")

你可以在你的正则表达式中进行前瞻和后视,看看你是否在一个表格标签内(取决于你正在使用的红宝石的版本,这可能不适用于你)。您可能希望通过在表标记上拆分字符串来启动方法,从而为您提供奇数个字符串。仅在偶数索引字符串上运行上面的正则表达式。然后将表字符串与字符串连接在一起。这将允许您正确终止和启动段落标记,并让您忽略表格中的换行符。

def simple_format( text )
  strings = text.split(/<\/?table>/)
  strings.each_with_index do |i, string|
    if i % 2 == 0 # even index == outside of table tags
      string.gsub!(/\r?\n/, "\n")    # \r\n and \r => \n
      # ...
      strings[i] = "<p>" + string + "</p>"
    else # odd index == inside of table tags
      strings[i] = "<table>" + string + "</table>"
    end
  end
  strings.join
end

也就是说,你可能想完全逃避正则表达式,因为我所描述的解决方案假设表标签或未终止的表标签中没有表标签。

答案 1 :(得分:0)

好吧,有点像这样吗?

  def simple_format( text )
      return text if ( text =~ /(<table.*>)/ ) # return text unchanged

      start_tag = '<p>'
      text = text.to_s.dup 
      text.gsub!(/\r\n?/, "\n")    # \r\n and \r => \n
      text.gsub!(/\n\n+/, "</p>\n\n#{start_tag}")  # 2+ newline  => paragraph 
      text.gsub!(/([^\n]\n)(?=[^\n])/, '\1<br />')  # 1 newline   => br 
      text.insert 0, start_tag  
      text << "</p>" 
  end

答案 2 :(得分:0)

bbcode和HTML不混用。事实上,bbcode专门设计为不允许使用html标签。由于这是bbcode的设计,我看不到破解它的方法。如果你想继续使用bbcode,你应该认为它不能用于HTML输入。

据我所知,bbcode没有html表的语法。如果您绝对需要表,请考虑切换到不同的解析器,或者允许使用像tinymce这样的完整HTML编辑器。