我正在创建一个函数,将第一个参数转换为 PHP var(我知道没用),并将其设置为等于第二个参数。我正在尝试 gsub!
它以摆脱所有不能在 PHP var 中使用的字符。这是我所拥有的:
dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match }
I have the puts match
there to make sure some of the characters were removed. name
is a variable passed into a method in which this is its purpose. I am getting this error:
TypeError: can't convert nil into String
cVar at ./Web.rb:31
(root) at C:\Users\Andrew\Documents\NetBeansProjects\Web\lib\main.rb:13
Web.rb
是这行所在的文件,main.rb
是调用此方法的文件。我该如何解决这个问题?
编辑:如果我删除 !在 gsub! 中,它会通过,但不会删除字符。
最佳答案
简答
使用 dvar = "$"+ name.tr(".?\/!@\#{}$%^&*()``~", '')
长答案
您面临的问题是 gsub!调用返回零。您不能将 (+) 字符串与 nil 连接起来。
发生这种情况是因为您的正则表达式格式不正确。您并没有转义特殊的正则表达式符号,例如 $、* 和 .,只是为了开始。此外,按照现在的方式,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
您的台词,已更正:
dvar = "$" + name.gsub(/\.|\?|\/|\!|\@|\\|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
# some things shouldn't (or aren't needed to) be escaped, I don't remember them all right now
正如 J-_-L 所指定的,您还可以使用字符类 ([]),我想这会使其更清晰一些。好吧,无论如何都很难在心理上进行解析。
dvar = "$" + name.gsub(/[\.\?\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")
但是因为你做的是简单的字符替换,所以最好的方法是tr(再次被J-_-L提醒!):
dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')
更容易阅读和修改。
关于ruby - 订阅!论证无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924757/