【发布时间】:2011-01-17 00:32:23
【问题描述】:
我正在尝试弄清楚如何将 ' 之类的引用替换为 \' 之类的内容。
我该怎么做?
我试过了
"'".gsub("'","\\'")
但它只是给出一个空字符串。我在这里做错了什么?
【问题讨论】:
-
我希望你不要试图逃避 SQL 输入。始终“准备”您的陈述。
-
不是,是转义码,不是SQL。
我正在尝试弄清楚如何将 ' 之类的引用替换为 \' 之类的内容。
我该怎么做?
我试过了
"'".gsub("'","\\'")
但它只是给出一个空字符串。我在这里做错了什么?
【问题讨论】:
这个怎么样
puts "'".gsub("'","\\\\'")
\'
原因是 \' 在 gsub(正则表达式)中表示 post-match,因此需要使用 \\' 进行转义,而 \ 显然被转义为 \\ ,以\\\\'结尾。
例子
>> "abcd".gsub("a","\\'")
=> "bcdbcd"
a 被a 之后的所有内容替换。
【讨论】:
$' 变量是匹配项右侧的字符串。在gsub 替换字符串中,相同的变量将是\'——因此出现了问题。
x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect # foo'foo
这应该可行:
x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
【讨论】:
我实际使用过的两步法...
BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"
只有在文本中明显没有使用“¤”时才有效...
【讨论】:
这可能是一个错误。或者至少,它打破了我对最小惊喜原则的想法。
irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
【讨论】:
这样做怎么样:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
不漂亮,但我认为它有效......
【讨论】:
ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]