2

我尝试用一​​个变量的内容替换一个 sub-str,它的名称与 sub-str 匹配:

>> str = "Hello **name**"
=> "Hello **name**"
>> name = "John"
=> "John"

str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error!

上面代码的最后一行是语法错误。和:

>> str.gsub(/\*\*(.*)\*\*/, '\1')
=> "Hello name"
>> str.gsub(/\*\*(.*)\*\*/, eval("name"))
=> "Hello John"

我想要的是结果:

str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John"

任何帮助将不胜感激。谢谢!

4

2 回答 2

7

试试这个:

str = "Hello **name**"
name = "John"
str.gsub(/\*\*(.*)\*\*/) { eval($1) }

gsub方法还接受一个块,该块将被评估并且返回值将用作替换。特殊变量$1$2等与\1在字符串中使用相同。

比 using 更好的替代方法eval()是使用 aHash替换值:

str = "Hello **name**"
names = { "name" => "John" }
str.gsub(/\*\*(.*)\*\*/) { names[$1] }
于 2010-03-29T08:31:33.953 回答
1

我意识到这不是您问题的答案,但是您看过Liquid 标记吗?它通过使用双括号 {{}} 基本上完成了同样的事情

@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template
@template.render( 'name' => 'tobi' )              # => "hi tobi"
于 2011-03-03T20:29:44.317 回答