2

我需要一个正则表达式,它将返回路径中的最后一个目录。

例如, from www.domain.com/shop/widgets/,返回“小部件”。

我有一个几乎有效的表达方式。

[^/].*/([^/]+)/?$ 

它将返回“小部件”,www.domain.com/shop/widgets/但不会来自www.domain.com/widgets/

我还需要忽略任何包含文件名的 URL。所以这www.domain.com/shop/widgets/blue_widget.html不会匹配。

这必须使用正则表达式来完成,就像 Zeus 服务器请求重写模块一样。

4

4 回答 4

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 ~] 
于 2012-04-01T15:42:38.087 回答
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 (/\/([^\/]+)\/$/);'
于 2012-04-01T15:15:21.900 回答
1

这通常应该有效:

/([^/.]+)/$

它匹配必须以斜杠结尾的字符串中倒数第二个斜杠之后的一组非斜杠、非句点字符。

“文件夹名称”将在第一个捕获组中。

于 2012-04-01T07:06:05.783 回答
0

您不需要 Perl 正则表达式。你需要一个 Zeus 能理解的正则表达式。尽管他们可能称其为 PCRE,但 PCRE 甚至不能处理所有 Perl 正则表达式。

这里的大多数答案都是错误的,因为他们没有考虑您可以作为输入获得的不同类型的 URL。

  • 仅获取 URL 的路径部分
  • 匹配路径部分以找到您需要的内容
  • 区分以文件名结尾的路径和不以文件名结尾的路径

您可以使用一些示例作为开始。我不使用 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 程序中放了什么,我都不愿意这样做。我会非常努力地首先在宙斯规则中完成它。向我们展示您到目前为止所拥有的。

于 2012-04-01T20:29:20.103 回答