2011-12-15 172 views
0
+一個文件夾

你能不能幫我找出一個正則表達式會從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 regex)的變體都是非常有用的。

+2

爲什麼另起爐竈?應該有CPAN上的模塊可以處理這個問題。也許?[URI](http://search.cpan.org/perldoc?URI)? – TLP 2011-12-15 13:18:14

回答

1
#!/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 
2
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