在 Vim 中搜索和替换字符串

在 Vim 中搜索和替换字符串

我有类似这样的代码:

$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

相关内容