我正在创建一个函数,将第一个参数转换为PHP var(无用,我知道),并将其设置为等于第二个参数.我试图gsub!摆脱所有不能在PHP var中使用的字符.这是我有的:
dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match }
我有puts match那里确保删除了一些角色.name是一个传递给方法的变量,其中这是它的目的.我收到此错误:
TypeError: can't convert nil into String
cVar at ./Web.rb:31
(root) at C:\Users\Andrew\Documents\NetBeansProjects\Web\lib\main.rb:13
Run Code Online (Sandbox Code Playgroud)
Web.rb是此行所在的文件,并且main.rb是调用此方法的文件.我怎样才能解决这个问题?
编辑:如果我删除了!在gsub!中,它会通过,但字符不会删除.
使用 dvar = "$" + name.tr(".?\/!@\#{}$%^&*()``~", '')
你面临的问题是gsub!电话正在返回零.你不能用一个nil连接(+)一个String.
这种情况正在发生,因为你的Regexp格式不正确.你没有逃避特殊的正则表达式符号,比如$,*和.,只是为了一个开始.此外,它现在的方式,只有当你的字符串按顺序包含所有符号时,gsub才会匹配.您应该使用管道(|)运算符进行OR运算.
GSUB!如果没有发生替换,也将返回nil.
请参阅gsub和gsub的文档!这里:http://ruby-doc.org/core/classes/String.html#M001186
我认为你应该替换gsub!与gsub.你真的需要name改变吗?
例:
name = "m$var.name$$"
dvar = "$" + name.gsub!(/\$|\.|\*/, "") # $ or . or *
# dvar now contains $mvarname and name is mvarname
Run Code Online (Sandbox Code Playgroud)
你的行,更正了:
dvar = "$" + name.gsub(/\.|\?|\/|\!|\@|\\|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
# some things shouldn't (or aren't needed to) be escaped, I don't remember them all right now
Run Code Online (Sandbox Code Playgroud)
当J -_- L指定时,你也可以使用一个字符类([]),这使得它更清晰一点,我想.好吧,无论如何,很难精神上解析.
dvar = "$" + name.gsub(/[\.\?\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")
Run Code Online (Sandbox Code Playgroud)
但是因为你正在做的是简单的字符替换,最好的方法是tr(再次由J -_- L提醒!):
dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')
Run Code Online (Sandbox Code Playgroud)
方便阅读和修改.