Почему мой Perl tr/// удаляет символы новой строки?
Вопрос
Я пытаюсь очистить ввод формы, используя следующую транслитерацию Perl:
sub ValidateInput {
my $input = shift;
$input =~ tr/a-zA-Z0-9_@.:;',#$%&()\/\\{}[]?! -//cd;
return $input;
}
Проблема в том, что эта транслитерация удаляет встроенные символы новой строки, которые пользователи могут ввести в поле текстовой области, которое я хочу сохранить как часть строки.Есть идеи, как я могу обновить это, чтобы он не удалял встроенные символы новой строки?Заранее спасибо за вашу помощь!
Решение 4
Спасибо за помощь, ребята! В конечном итоге я решил обработать все данные в нашей базе данных, чтобы удалить символ, который вызывал проблему, чтобы любой текст, который был отправлен через нашу форму обновления (а не изменен пользователем), соответствовал тому, что было в базе данных. В соответствии с вашими предложениями я также добавил несколько дополнительных разрешенных символов в регулярное выражение проверки.
Другие советы
Я не уверен, что вы делаете, но я подозреваю, что вы пытаетесь сохранить все символы между пробелом и тильдой в таблице ASCII, а также некоторые пробельные символы. Я думаю, что большая часть вашего списка сводится к одному диапазону \ x20- \ x7e
:
$string =~ tr/\x0a\x0d\x20-\x7e//cd;
Если вы хотите выбить такой символ, как "
(хотя я подозреваю, что вы действительно этого хотите, поскольку вы разрешаете одинарную кавычку), просто измените диапазон:
$string =~ tr/\x0a\x0d\x20-\xa7\xa9-\x7e//cd;
Это немного византийский способ сделать это! Если вы добавите \ 012, он должен сохранить символы новой строки.
$input =~ tr/a-zA-Z0-9_@.:;',#$%&()\/\{}[]?! \012-//cd;
Видеть Типы содержимого форм.
application/x-www-form-urlencoded
:Разрывы строк представлены парами «CR LF» (т.е.%0D%0A
)....
multipart/form-data
:Как и во всех передачах MIME, «CR LF» (т. е.%0D%0A
) используется для разделения строк данных.
Я не знаю, что у вас в базе.Теперь вы знаете, что видит ваш скрипт.
Ты используешь CGI.pm
, верно?