Поиск и замена строки в 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
Другие вопросы по тегам