此代码中的所有内容都能正常运行,但$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
谢谢!
答案 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化费用,并且生成大型列表几乎是免费的。