1

У меня есть код, похожий на этот:

$ POST _ [ '%']

где% - любая длина любой буквы + строки чисел, и я хочу заменить ее на

mysql_real_escape_string($POST['%'])

до сих пор я создал эту команду, но она не распознает $ POST ['.'] как строку.

:%s/$_POST['.']/mysql_escape_string($_POST['\=submatch(0)'])/gc

4 ответа4

2

$, [и] являются метасимволами в регулярных выражениях. Попробуйте это (не проверено)

:%s/\$_POST\['.'\]/mysql_escape_string(\$_POST\['\=submatch(0)'\])/gc

[править] Спасибо @tink

2

Во-первых, использование \=submatch(0) слишком сложно, просто используйте \0. И имейте в виду, что суб-совпадение 0 всегда является полностью сопоставленным шаблоном, поэтому ваш шаблон замены имеет некоторую избыточность. Во- . атом соответствует только одному символу. И, наконец, вам нужно избежать [] и $ . Попробуйте это вместо этого:

:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc

Использование \{-} означает совпадение с любым числом предыдущего атома без жадности (в отличие от *).

Я также отмечаю, что ваши примеры несовместимы друг с другом. Это " $POST_[...] ", " $_POST[...] " или просто " $POST[...] "?

Возможно, вы захотите взглянуть на книгу, как освоение регулярных выражений.

1
s/^\(.*\)$/mysql_real_escape_string(\1)/

Кажется, делать то, что вы хотите. Это просто, поскольку вы просто добавляете текст вокруг существующей строки, а не заменяете ее внутри.

0

Прошло 8 месяцев, и мне нужно это снова, так что я решил предложить аккуратное решение:

sed 's/\$_GET\[\(.*\)\]/mysqli_real_escape_string(\$_GET\[\1\])/g' test.php

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .