查找嵌套开始和结束标记的最佳方法

时间:2012-02-22 19:57:58

标签: ruby

我正在使用ROR制作基本讨论区。当用户发布对邮件的响应时,输入文本区域使用标记预先填充引号中的消息: [QUOTE] 。因此格式为:

  

[QUOTE]引用的消息在这里[/ QUOTE]

目前,我有一个简单的解决方案,使用 message.sub替换[QUOTE]和[/ QUOTE]与HTML(' [QUOTE]',' html转到这里&# 39;)只要[QUOTE]或[/ QUOTE]仍然存在。当我回复引用的消息时,我将HTML转换回[QUOTE]标签,以确保预先填充的输入文本区域中没有HTML。因此,引用的引用将如下所示:

  

[QUOTE] [QUOTE]引用此处留言[/ QUOTE] [/ QUOTE]

这是问题所在。如果我再次运行当前方法,我将获得重复的HTML字段,如:

<div class='test'><div class='test'>quoted message goes here</div></div>

相反,我希望能够找到一个看起来像这样的解决方案:

<div class='test1'><div class='test2'>quoted message goes here</div></div>

依旧...... 有关循环的最佳方法的任何建议吗?

2 个答案:

答案 0 :(得分:5)

如果你想进行深度跟踪,你必须使用gsub的块方法:

text = "[QUOTE][QUOTE]quoted message here[/QUOTE][/QUOTE]"

quote_level = 0

new_text = text.gsub(/\[\/?QUOTE\]/) do |m|
  case (m)
  when '[QUOTE]'
    quote_level += 1
    "<div class='test#{quote_level}'>"
  when '[/QUOTE]'
    quote_level -= 1
    "</div>"
  end
end

puts new_text.inspect
# => "<div class='test1'><div class='test2'>quoted message here</div></div>"

在处理无效的嵌套对时,您可以使其更加健壮,但对于格式良好的标记,这应该可行。

答案 1 :(得分:1)

这是一个想法:

拿这个正则表达式

(\[QUOTE\])(.*?)(\[\/QUOTE\])

并将其应用于您的字符串。它将匹配开始标记,结束标记和内容。然后获取内容并再次应用正则表达式。如果有任何匹配,那将是你的第二级嵌套。有匹配时重复。

在这里演示:http://rubular.com/r/MkGsnUj3vL