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将对特定文件夹中的图像的调用发送到所述脚本。我通过路径信息获取目录和图像名称。
我很欣赏过去和现在的所有建议......我学到了很多东西。
答案 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/)
错误 - !=
运算符应为!~
(jpe?g|gif|png)
可以修改为(?:jpe?g|gif|png)
以禁用对该组括号的捕获(在大多数情况下,效率提升是名义上的,但它偶尔会产生差异,例如在快速循环中,所以我除非我需要,否则养成不捕捉的习惯。.
- 即[^\.]
可以是[^.]
(我相信你需要逃脱的唯一角色)本身,但不要以此作为福音):)答案 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";
}