2010-01-02 86 views
1

我试图创建我的rails论坛上的BBcode [code]标签,和我有表达的问题:红宝石GSUB功能

param_string.gsub!(/\[code\](.*?)\[\/code\]/im, '<pre>\1</pre>') 

如何获得正则表达式匹配的回报我们的(文字介于[code] [/ code]标签之间),并且转义所有的html和其他一些字符呢?

我已经试过这样:

param_string.gsub!(/\[code\](.*?)\[\/code\]/im, '<pre>' + my_escape_function('\1') + '</pre>') 

,但没有奏效。它只是将“\ 1”作为字符串传递给函数。

+0

你试过双引号(' “\ 1”')? – 2010-01-02 16:00:41

+0

是的,也没有工作。 – Marjan 2010-01-02 16:17:35

回答

3

您应该注意正则表达式的贪婪行为。所以,正确的代码如下所示:

html.gsub!(/\[(\S*?)\](.*?)\[\/\1\]/) { |m| escape_method($1, $2) } 

escape_method则是这样的:

def escape_method(type, string) 
    case type.downcase 
    when 'code' 
     "<pre>#{string}</pre>" 
    when 'bold' 
     "<b>#{string}</b>" 
    else 
     string 
    end 
end 
+0

正如你所看到的,这段代码可以扩展为支持每个BBcode标签 – 2010-01-19 14:33:20

+0

这是一个很好的建议,应该加速很多事情。谢谢! – Marjan 2010-01-19 22:55:26

0

有人在这里发布了一个答案,但他们已经删除它。

我已经尝试过他们的建议,并且使它适用于一些小的改变。无论你是谁,谢谢! :)

param_string.gsub!(/\[code\](.*?)\[\/code\]/im) {|s| '<pre>' + my_escape_function(s) + '</pre>' } 
0

您可以简单地使用"<pre>#{$1}</pre>"您的重置价值。