为什么我的Perl tr ///删除换行符?

时间:2009-10-30 23:39:57

标签: perl newline

我正在尝试使用以下Perl音译清理表单输入:

sub ValidateInput {
 my $input = shift;
 $input =~ tr/a-zA-Z0-9_@.:;',#$%&()\/\\{}[]?! -//cd;
 return $input;
}

问题是这个音译是删除用户可能进入textarea字段的嵌入式换行符,我希望将其保留为字符串的一部分。有关如何更新此内容以阻止其删除嵌入式换行符的任何想法?在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

我不确定你在做什么,但我怀疑你是想在ASCII表中保留空格和波浪号之间的所有字符,以及一些空格字符。我认为您的大部分内容都会缩小到一个范围\x20-\x7e

$string =~ tr/\x0a\x0d\x20-\x7e//cd;

如果你想淘汰像"这样的角色(虽然我怀疑你真的想要它,因为你允许单引号),只需调整你的范围:

$string =~ tr/\x0a\x0d\x20-\xa7\xa9-\x7e//cd;

答案 1 :(得分:1)

这有点像拜占庭式的做法!如果你添加\ 012,它应该保留换行符。

$input =~ tr/a-zA-Z0-9_@.:;',#$%&()\/\{}[]?! \012-//cd;

答案 2 :(得分:1)

请参阅Form content types

  

application/x-www-form-urlencoded :换行符表示为“CR LF”对(即%0D%0A)。

     

...

     

multipart/form-data :与所有MIME传输一样,“CR LF”(即%0D%0A)用于分隔数据行。

我不知道你在数据库里有什么。现在您知道它看到的脚本了什么。

您正在使用CGI.pm,对吧?

答案 3 :(得分:-1)

感谢帮帮!最终,我决定处理数据库中的所有数据,以删除导致问题的字符,以便通过我们的更新表单提交的任何文本(并且不会被用户更改)与数据库中的文本相匹配。根据您的建议,我还在验证正则表达式中添加了一些其他允许的字符。