正则表达式从URL中提取子域名?

时间:2009-07-27 16:16:14

标签: regex

我有一堆域名如下:

http://subdomain.example.com(example.com始终是example.com,但子域名不同)。

我需要“子域名”。

有耐心学习正则表达式的某些人可以帮助我吗?

7 个答案:

答案 0 :(得分:36)

上述正则表达式的问题在于:如果您不知道协议是什么,或者域名后缀是什么,您将得到一些意想不到的结果。这是针对这些情况的一点正则表达式。 :d

/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i  //javascript

这应始终返回组1中的子域(如果存在)。 这是一个Javascript示例,但它也适用于支持正面预见断言的任何其他引擎:

// EXAMPLE of use
var regex = /(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i
  , whoKnowsWhatItCouldBe = [
                        "www.mydomain.com/whatever/my-site" //matches: www
                      , "mydomain.com"// does not match
                      , "http://mydomain.com" // does not match
                      , "https://mydomain.com"// does not match
                      , "banana.com/somethingelse" // does not match
                      , "https://banana.com/somethingelse.org" // does not match
                      , "http://what-ever.mydomain.mu" //matches: what-ever
                      , "dev-www.thisdomain.com/whatever" // matches: dev-www
                      , "hot-MamaSitas.SomE_doma-in.au.xxx"//matches: hot-MamaSitas
                  , "http://hot-MamaSitas.SomE_doma-in.au.xxx" // matches: hot-MamaSitas
                  , "пуст.пустыня.ru" //even non english chars! Woohoo! matches: пуст
                  , "пустыня.ru" //does not match
                  ];

// Run a loop and test it out.
for ( var i = 0, length = whoKnowsWhatItCouldBe.length; i < length; i++ ){
    var result = whoKnowsWhatItCouldBe[i].match(regex);
    if(result != null){
      // YAY! We have a match!
    } else {
      // Boo... No subdomain was found
    }
}

答案 1 :(得分:21)

/(http:\/\/)?(([^.]+)\.)?domain\.com/

然后$ 3(或\ 3)将包含“subdomain”(如果有的话)。

如果你想在第一组中拥有子域名,那么你的子域名 正则表达式引擎支持非捕获组(害羞组),使用 这是由palindrom建议的:

/(?:http:\/\/)?(?:([^.]+)\.)?domain\.com/

答案 2 :(得分:4)

纯粹是子域名字符串(结果为$ 1):

^http://([^.]+)\.domain\.com

使http://可选(结果为$ 2):

^(http://)?([^.]+)\.domain\.com

使http://和子域可选(结果为$ 3):

(http://)?(([^.]+)\.)?domain\.com

答案 3 :(得分:2)

应该只是

\Qhttp://\E(\w+)\.domain\.com

子域名将是第一组。

答案 4 :(得分:0)

#!/usr/bin/perl

use strict;
use warnings;

my $s = 'http://subdomain.example.com';
my $subdomain = (split qr{/{2}|\.}, $s)[1];

print "'$subdomain'\n";

答案 5 :(得分:0)

对于其中带有点字符的数学子域,我使用了这个

https?:\/\/?(?:([^*]+)\.)?domain\.com

获取协议后直到域的所有匹配字符。

https://sub.domain.com(子)

https://sub.sub.domain.com(子) ...

答案 6 :(得分:-1)

第一组

http://(.*).example.com