Поиск и замена строки в Vim
У меня есть код, похожий на этот:
$ POST _ [ '%']
где% - любая длина любой буквы + строки чисел, и я хочу заменить ее на
mysql_real_escape_string($POST['%'])
до сих пор я создал эту команду, но она не распознает $POST['.'] как любую строку.
:%s/$_POST['.']/mysql_escape_string($_POST['\=submatch(0)'])/gc
4 ответа
Во-первых, ваше использование \=submatch(0)
слишком сложный, просто используйте \0. И имейте в виду, что суб-совпадение 0 всегда является полностью сопоставленным шаблоном, поэтому ваш шаблон замены имеет некоторую избыточность. Во-вторых, .
атом соответствует только одному символу. И, наконец, вам нужно избежать []
и $
, Попробуйте это вместо:
:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc
Использование \{-}
означает соответствовать любому числу предыдущего атома, не жадным способом (в отличие от *
).
Я также отмечаю, что ваши примеры несовместимы друг с другом. Это "$POST_[...]
","$_POST[...]
" или просто "$POST[...]
"?
Возможно, вы захотите взглянуть на книгу, как освоение регулярных выражений.
$, [и] являются метасимволами в регулярных выражениях. Попробуйте это (не проверено)
:%s/\$_POST\['.'\]/mysql_escape_string(\$_POST\['\=submatch(0)'\])/gc
[править] Спасибо @tink
с /^\(.*\)$/mysql_real_escape_string(\1)/
кажется, делает то, что вы хотите. Это просто, поскольку вы просто добавляете текст вокруг существующей строки, а не заменяете ее внутри.
Прошло 8 месяцев, и мне нужно это снова, поэтому я хотел бы предложить аккуратное решение:
sed 's/\$_GET\[\(.*\)\]/mysqli_real_escape_string(\$_GET\[\1\])/g' test.php