我有类似这样的代码:
$POST_['%']
其中 % 是任意长度的任意字母+数字字符串,我想用
mysql_real_escape_string($POST['%'])
到目前为止我已经建立了这个命令但它不能将 $POST['.'] 识别为任何字符串。
:%s/$_POST['.']/mysql_escape_string($_POST['\=submatch(0)'])/gc
答案1
首先,您对 的使用\=submatch(0)
过于复杂,只需使用 \0 即可。请注意,子匹配 0 始终是完全匹配的模式,因此您的替换模式具有一些冗余。其次,原子.
仅匹配一个字符。最后,您需要转义[]
's 和$
。请尝试以下方法:
:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc
使用\{-}
意味着以非贪婪的方式匹配任意数量的前一个原子(与 相反*
)。
我还注意到,你举的例子自相矛盾。是“ $POST_[...]
”,“ $_POST[...]
”还是只是“ $POST[...]
”?
你可能想看看这样的书掌握正则表达式。
答案2
$、[ 和 ] 是正则表达式中的元字符。试试这个(未经测试)
:%s/\$_POST\['.'\]/mysql_escape_string(\$_POST\['\=submatch(0)'\])/gc
[编辑] 感谢@tink
答案3
s/^\(.*\)$/mysql_real_escape_string(\1)/
似乎可以满足您的要求。这很简单,因为您只是在现有字符串周围添加文本,而不是实际替换其中的内容。
答案4
8 个月过去了,我再次需要这个,因此我认为我可以提供一个很好的解决方案:
sed 's/\$_GET\[\(.*\)\]/mysqli_real_escape_string(\$_GET\[\1\])/g' test.php