Как получить последний каталог из URL-пути, используя правило переписывания Zeus? - PullRequest
2 голосов
/ 01 апреля 2012

Мне нужно регулярное выражение, которое будет возвращать последний каталог в пути.

например, из 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 ]

2 голосов
/ 01 апреля 2012
/^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 голос
/ 01 апреля 2012
#!/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 (/\/([^\/]+)\/$/);'
1 голос
/ 01 апреля 2012

Обычно это должно работать:

/([^/.]+)/$

Соответствует набору символов без косой черты, непериодических после косой черты в строке, которая должна заканчиваться косой чертой.

«Имя папки» будет в первой группе захвата.

0 голосов
/ 02 апреля 2012

Вам не нужно регулярное выражение Perl. Вы хотите регулярное выражение, которое Зевс поймет. Хотя они могут называть этот PCRE, даже PCRE не обрабатывает все регулярные выражения Perl.

Большинство ответов здесь неверны, потому что они не думают о различных видах URL, которые вы можете получить в качестве ввода.

  • Получить только часть пути URL
  • Сопоставьте с частью пути, чтобы найти то, что вам нужно
  • Различают пути, оканчивающиеся на имя файла, и пути, которые не

Есть несколько примеров, которые вы можете использовать для начала. Я не использую Зевса и не хочу, поэтому следующая часть зависит от вас:

Я читал, что вы можете передать запрос в программу Perl через Perl Extensions для ZWS, но я был бы удивлен, если бы вам нужно было это сделать. Если вам придется прибегнуть к этому, я бы использовал модуль 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. Я бы очень постарался, чтобы это было сделано сначала в правилах Зевса. Покажите нам, что у вас есть.

...