如何清理字符串以用作PERL中的文件名?

时间:2010-08-18 19:06:17

标签: regex perl

我有一份工作申请表,人们填写他们的姓名和联系信息并附上简历。

通过电子邮件发送联系信息并附上简历。

我想将文件名更改为竞赛编号及其名称的组合。

如何清理生成的文件名,以便我可以保证其中没有无效字符。到目前为止,我可以删除所有空格和小写字符串。

我想删除任何标点符号(如撇号)和非字母字符(如重音符号)。

例如,如果“AndréO'Hara”使用此表单提交了他的简历作业555,如果删除所有可疑字符并且我最终得到的文件名如下,我会很高兴:

555-andr-ohara-resume.doc

我可以使用什么正则表达式删除所有非字母字符?

到目前为止,这是我的代码:

 # Create a cleaned up version of competition number + First Name + Last Name number to name the file
 my $hr_generated_filename = $cgi->param("competition")  . "-" . $cgi->param("first") . "-" . $cgi->param("last");

 # change to all lowercase
 $hr_generated_filename = lc( $hr_generated_filename );

 # remove all whitespace
 $hr_generated_filename =~ s/\s+//g;

 push @{ $msg->{attach} }, {
    Type        => 'application/octet-stream',
    Filename    => $hr_generated_filename.".$file-extension",
    Data        => $data,
    Disposition => 'attachment',
    Encoding    => 'base64',
 };

1 个答案:

答案 0 :(得分:12)

如果您尝试“白名单”字符,您的基本方法应该是使用字符类补充:

[...]在Perl正则表达式中定义一个字符类,它将匹配内部定义的任何字符(包括a-z等范围)。如果您添加^,它将成为补充,因此它会匹配括号内定义的字符。

$hr_generated_filename =~ s/[^A-Za-z0-9\-\.]//g;

这将删除任何不是未加重音的拉丁字母,数字,短划线或点。要添加到白名单,只需在[^...]内添加字符。