如何在Perl中验证只有八位数和一个扩展名的文件名?

时间:2009-10-03 17:13:43

标签: perl validation

Perl(没有加载模块,-Tw& strict) 我在这里发现了很多关于正则表达式和模式匹配的信息,但不完全是我需要的。 我想知道这是否是验证一些事情的正确方法。 对于这里的初学者尝试感到抱歉。我对此很陌生。

my $this = "12345678";

if ($this != m/\b[0-9]{8}\b/x) { print "$this is bad"; }

my $that = "12345678.gif";

if ($that != m/\b[0-9]{8}\.gif\b/x) { print "$that is bad"; }

or

if ($that != m/\b[0-9]{8}\.(jpe?g|gif|png)\b/x) { print "$that is bad"; }


my ($ext) = $that =~ m/\.([^\.]+)$/x;

# verify extension
if  ($ext != m/\.(jpe?g|png|gif)$/x ){ print "$ext is bad"; }

# for content type
if ($ext eq "jpg") {$ext = "jpeg";} 

我使用/ x因为perl :: critic表示我需要它。传递/ x所以......

\ d不是一个选项,应该从我在这里阅读的内容中避免。

文件名“that”必须是8位+图像类型。另一组数字“this”实际上是文件夹名称。这为图像服务脚本提供了一点错误检查。根htaccess将对特定文件夹中的图像的调用发送到所述脚本。我通过路径信息获取目录和图像名称。

我很欣赏过去和现在的所有建议......我学到了很多东西。

3 个答案:

答案 0 :(得分:3)

如果你在污点检查下运行,这不是这样做的方法。你需要匹配你需要的模式,然后记住在内存变量中清除污点:

my $this = ...;

my $regex = qr/
          ^             # beginning of string
          (             # start of $1
            [0-9]{8}
            \.
            (gif|jpg)   # extension in $2
          )
          \z            #end of string
          /x;

my( $cleansed, $extension ) = do { 
    if( $this =~ m/$regex/ ) { ( $1, $2 ) }
    else                  { die "Bad filename!" }
    };

我不确定为什么你的正则表达式开头有\b。它可能不会做你认为它做的事情。如果您希望文件名只是数字,请改用字符串锚点的^开头。这样,数字之前就什么都没有了。同样,字符串锚\z的结尾表示扩展后没有任何内容。

如果您需要匹配HTTP响应的内容类型的扩展名,我猜你正在做,你可以使用哈希来制作地图:

 my %types = (
      jpg => jpeg,
      gif => gif,
      ...
      );

现在你有了哈希,你可以将它用作另一个验证级别:

 unless( exists $types{$extension} ) { die "Unsupported type!" }

答案 1 :(得分:2)

你上面的大部分内容都很好看。几点:

  • if ($ext != m/pattern/)错误 - !=运算符应为!~
  • \ d很好,如果你正在解析文件名或其他不太可能是unicode的东西
  • 避免/ x,除非你真的需要它(为了便于阅读,你没有将正则表达式分成多行)。就此而言,除非您需要,否则请避开任何标志
  • (jpe?g|gif|png)可以修改为(?:jpe?g|gif|png)以禁用对该组括号的捕获(在大多数情况下,效率提升是名义上的,但它偶尔会产生差异,例如在快速循环中,所以我除非我需要,否则养成不捕捉的习惯。
  • 你不需要在角色类中逃避. - 即[^\.]可以是[^.](我相信你需要逃脱的唯一角色)本身,但不要以此作为福音):)
  • 它是“Perl”,而非“PERL”:)

答案 2 :(得分:0)

您需要使用=~!~代替==!=进行正则表达式匹配。在删除冗余代码和优化之后,我会这样写。

my $that = "12345678.gif";    
if ($that =~ m/\b[0-9]{8}\.(jpe?g|gif|png)\b/x)
{
    my $ext = $1; 
    if ($ext eq "jpg") {$ext = "jpeg";}
}
else
{
    print "$that is bad";
}