Во-первых, использование \=submatch(0) слишком сложно, просто используйте \0. И имейте в виду, что суб-совпадение 0 всегда является полностью сопоставленным шаблоном, поэтому ваш шаблон замены имеет некоторую избыточность. Во- . атом соответствует только одному символу. И, наконец, вам нужно избежать [] и $ . Попробуйте это вместо этого:
:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc
Использование \{-} означает совпадение с любым числом предыдущего атома без жадности (в отличие от *).
Я также отмечаю, что ваши примеры несовместимы друг с другом. Это " $POST_[...] ", " $_POST[...] " или просто " $POST[...] "?
Возможно, вы захотите взглянуть на книгу, как освоение регулярных выражений.