Ruby正则表达式:在哈希中设置$ 1变量

时间:2011-08-12 05:48:09

标签: ruby regex

此代码中的所有内容都能正常运行,但$1变量的内容未正确显示。根据我的测试,所有匹配都正在完成,我只是在弄清楚如何实际输出$1的内容。

  codeTags = {
              /\[b\](.+?)\[\/b\]/m => "<strong>#{$1}</strong>",
              /\[i\](.+?)\[\/i\]/m => "<em>#{$1}</em>"
             }

             regexp = Regexp.new(/(#{Regexp.union(codeTags.keys)})/)
             message = (message).gsub(/#{regexp}/) do |match|
               codeTags[codeTags.keys.select {|k| match =~ Regexp.new(k)}[0]]
             end

  return message.html_safe

谢谢!

1 个答案:

答案 0 :(得分:2)

一旦你这样做:

codeTags = {
    /\[b\](.+?)\[\/b\]/m => "<strong>#{$1}</strong>",
    /\[i\](.+?)\[\/i\]/m => "<em>#{$1}</em>"
}

值中的#{$1}位使用当时$1中发生的任何内容进行插值。这些值很可能是"<strong></strong>""<em></em>",而且这些值不是很有用。

regexp已经是正则表达式对象,因此gsub(/#{regexp}/)应该只是gsub(regexp)。类似的内容适用于codeTags的键,它们已经是正则表达式对象,因此您不需要Regexp.new(k)

我会改变整个结构,你的事情过于复杂。这样简单的东西只适用于两个替代品:

message = message.gsub(/\[b\](.*?)\[\/b\]/) { '<strong>' + $1 + '</strong>' }
message = message.gsub(/\[i\](.*?)\[\/i\]/) { '<em>'     + $1 + '</em>'     }

如果您尝试一次性完成所有操作,您将遇到嵌套问题:

message = 'Where [b]is[/b] pancakes [b]house [i]and[/i] more[/b] stuff?'

如果你想用一个表达式正确处理类似的东西,你最终不得不使用递归gsub和一些lambdas。

有更好的事情可以花时间而不是试图在这样的事情上聪明。

对评论的回复:如果您有更多bb-tag和一些表情符号需要担心,每页有几条消息,那么您应该在创建每条消息时对其进行HTML化。如果您因某些原因需要BB-Code,那么您只能存储HTML版本或HTML和BB-Code版本。这样,您只需为每条消息支付一次HTML化费用,并且生成大型列表几乎是免费的。