我需要一个正则表达式,它将返回路径中的最后一个目录。
例如,从www.domain.com/shop/widgets/
返回“小部件”。
我的表达几乎可以奏效。
[^/].*/([^/]+)/?$
它会从www.domain.com/shop/widgets/
返回“小部件”,但不会从www.domain.com/widgets/
我还需要忽略包含文件名的任何网址。因此www.domain.com/shop/widgets/blue_widget.html
将不匹配。
这必须使用正则表达式来完成,就像Zeus服务器请求重写模块一样。
答案 0 :(得分:2)
/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/
这是做什么的?
在Perl中实现:
[ghoti@pc ~] cat perltest
#!/usr/local/bin/perl
@test = (
'www.example.com/path/to/file.html',
'www.example.com/match/',
'www.example.com/pages/match/',
'www.example.com/pages/widgets/thingy/',
'www.example.com/foo/bar/baz/',
);
foreach (@test) {
$_ =~ m/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/i;
printf(">> %-50s\t%s\n", $_, $2);
}
[ghoti@pc ~] ./perltest
>> www.example.com/path/to/file.html
>> www.example.com/match/ match
>> www.example.com/pages/match/ match
>> www.example.com/pages/widgets/thingy/ thingy
>> www.example.com/foo/bar/baz/ baz
[ghoti@pc ~]
答案 1 :(得分:1)
这通常应该有效:
/([^/.]+)/$
它匹配一个字符串倒数第二个斜杠之后的一组非斜杠非句点字符,该字符串必须以斜线结尾。
“文件夹名称”将位于第一个捕获组中。
答案 2 :(得分:1)
#!/usr/bin/perl
use strict;
use warnings;
$_ = 'www.domain.com/shop/widgets/';
print "$1\n" if (/\/([^\/]+)\/$/);
$_ = 'www.domain.com/shop/widgets/blue_widget.html';
print "$1\n" if (/\/([^\/]+)\/$/);'
答案 3 :(得分:0)
您不需要Perl正则表达式。你想要一个Zeus会理解的正则表达式。虽然他们可能会调用该PCRE,但PCRE也不会处理所有Perl正则表达式。
这里的大部分答案都是错误的,因为他们没有考虑您可以作为输入获得的不同种类的网址。
您可以将一些示例用作开头。我不使用Zeus并且不想,所以下一部分取决于你:
我已经读过您可以通过Perl Extensions for ZWS将请求传递给Perl程序,但如果您需要这样做,我会感到惊讶。如果你不得不诉诸于此,我将使用URI模块来解析URI并提取路径。完成后,将路径分成它的组件:
use URI;
my $uri = URI->new( ... ); # I don't know how Zeus passes data
my $path = $uri->path;
# undef to handle the leading /
my( undef, @parts ) = split $path, '/';
到目前为止,您必须决定如何将某些内容识别为目录。如果您直接映射到文件系统结构,那么只需在@parts
之后弹出元素,直到找到目录,然后倒数想要跳过的数字。
但是,无论我在Perl程序中添加什么,我都会这么做。我首先尝试在Zeus规则中尽力完成它。告诉我们你到目前为止所拥有的。