Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Домен из URL


Автор: Ace Wentura 3.3.2005, 19:34
Собственно, задача - получить доменное имя из URL.
То есть при URL www.yandex.ru/jshfgsdf/fksdhdfw/vshgvwef/sdfkwjf должно возвращаться www.yandex.ru. Но и на http:// и на всякие там org.net.spb.ru/sndfvjdsf/jshfgsdf/ тоже должно нормально реагировать.
Может есть стандартные средства?

Автор: korob2001 3.3.2005, 23:47
Написал такую подпрограмму get_domain, в качестве параметра, она принимает url, а затем возвратит его доменное имя.
Код

#!/usr/bin/perl -w
use strict;
# Допустим есть массив с разными url
my @urls = ( 'http://yandex.ru/catalog/lib/cat.html',
            'www.yahoo.com/search/results/search.php',
            'ftp://filmz.tr.tk/home/toolz/film.avi',
            'http://www.sharereactor.ru/games-catamog/gm.htm' );

# Это та самая подпрограмма
sub get_domain($) {
   my $url = shift;
   if ( substr( $url, 0, 1 ) =~ /^w$/i ) {
        $url = ( split(/\//, $url ) )[0];
   } else {
        $url = $1 if $url =~ /^(.+?\/\/.+?)\//;
   }
 return $url;
}

# Проходим по всему массиву и возвращаемый подпрограммой
# результат выводим в STDOUT
map( print(get_domain( $_ ) , "\n"), @urls );

Может я конечно не всё учёл, но url такого плана как в массиве @urls, она обработает как надо.
Если будут вопросы по коду, пиши.
Удачи.

Автор: GoodBoy 4.3.2005, 11:49
Ace Wentura
самый простой вариант:

Код
$url = 'http://www.qwe.ru/';      #произвольный адрес
$url =~ s/^[a-z]+\:\/\///;        #чистим начало от типа протокола (http://, ftp:// и т.д.)
$domain = (split(/\//, $url))[0]; #режем строку по символу "/" и забираем первый элемент массива

Автор: Ace Wentura 4.3.2005, 12:38
Спасибо большое за код. На его основе написал ещё один, которым реализовал ещё кое-какие возможности, которые забыл описать. Нужно было ещё выдирать IP из адресов.

Вот код. Может кому пригодиться :-)

Код


#!/usr/bin/perl -w
use strict;
my @urls = ( 'http://yandex.ru/catalog/lib/cat.html',
           'www.yahoo.com/search/results/search.php',
           'ftp://filmz.tr.tk/home/toolz/film.avi',
           'http://www.sharereactor.ru/games-catamog/gm.htm',
           '10.0.0.1/jhgdfjhsd/dfuwnbvxc',
           'http://10.0.0.50/jhsdgf/sdfiwe',
           'yahoo.com/jsdgfs/sdfhgsd' );
sub get_domain($) {
  my $url = shift;
  print("Before == $url\n");
  $_ = $url;
  s/(\w*\.\w*)(\/.*)/$1/;
  $url = $_;
  print("After  == $url\n");
  return $url;
}
map( print(get_domain( $_ ) , "\n\n"), @urls );



Есть извращения, конечно, но... :-)

Автор: GoodBoy 4.3.2005, 13:06
Ace Wentura
А зачем извращаться??? Мой вариант вернёт тебе и доменное имя и IP-адрес!!!

Автор: korob2001 4.3.2005, 14:51
Цитата

Ace Wentura
А зачем извращаться??? Мой вариант вернёт тебе и доменное имя и IP-адрес!!!

А я такой шаблон написал:
Код

s/^(.+\..+?)\/(?:.+)?/$1/

А вот так можно его заюзать:
Код

#!/usr/bin/perl -w
use strict;
my @urls = ( 'http://yandex.ru/catalog/lib/cat.html',
           'www.yahoo.com/search/results/search.php',
           'ftp://filmz.tr.tk/home/toolz/film.avi',
           'http://www.sharereactor.ru/games-catamog/gm.htm',
           '10.0.0.1/jhgdfjhsd/dfuwnbvxc',
           'http://10.0.0.50/jhsdgf/sdfiwe',
           'yahoo.com/jsdgfs/sdfhgsd' );

map( s/^(.+\..+?)\/(?:.+)?/$1/, @urls );
print join("\n", @urls);

Enjoy ;))))

Автор: Sadok 4.3.2005, 15:29
Ace Wentura
Цитата
Собственно, задача - получить доменное имя из URL.


use URI::Split qw(uri_split);
$uri = "http://forum.vingrad.ru/index.php?showtopic=44335&unread=1&st=0&#entry342547";
($scheme, $auth, $path, $query, $frag) = uri_split($uri);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)