Извлечь хост + одну папку из пути

Не могли бы вы помочь мне понять регулярное выражение, которое будет извлекаться из URL-адреса:

  1. имя хоста, если в пути, следующем за ним, не указана папка, например.

    http://jj.com/' -> 'jj.com
    http://jj.com/index.php' -> 'jj.com
    http://jj.com/query?q=http://kk.uk' -> 'jj.com
    
  2. имя хоста + одна папка из пути, если в пути указана хотя бы одна папка, например.

    'http://jj.com/site/index.php' -> 'jj.com/site'
    'http://jj.com/site/second/aldldls.html' -> 'jj.com/site'
    

Можно ли сделать это с помощью всего одного регулярного выражения?

Кстати, я буду использовать функцию regex_extract из куста, но любой вариант регулярного выражения (например, регулярное выражение perl), который может это сделать, был бы чрезвычайно полезен.


person twowo    schedule 15.12.2011    source источник
comment
Зачем изобретать велосипед? В CPAN должны быть модули, которые могут справиться с этим. URI возможно?   -  person TLP    schedule 15.12.2011


Ответы (2)


#!/usr/bin/perl

use strict;
use warnings;

for (<DATA>) {
    s!^http://([^/]+/([^\?/]+/)?).*!$1!;
    s!/\s*$!!;
    print "$_\n";
}

__DATA__
http://jj.com/
http://jj.com/index.php
http://jj.com/query?q=http://kk.uk
http://jj.com/site/index.php
http://jj.com/site/second/aldldls.html

Выход:

jj.com
jj.com
jj.com
jj.com/site
jj.com/site
person flesk    schedule 15.12.2011

use 5.010;
use URI;

for (
    'http://jj.com/',
    'http://jj.com/index.php',
    'http://jj.com/query?q=http://kk.uk',
    'http://jj.com/site/index.php',
    'http://jj.com/site/second/aldldls.html',
) {
    my $u = URI->new($_);
    say (
        ($u->path_segments)[2]
            ? join q(/), $u->host, ($u->path_segments)[1]
            : $u->host
    );
}

Выход

jj.com
jj.com
jj.com
jj.com/site
jj.com/site
person daxim    schedule 15.12.2011