2016-04-12 60 views
-2

我需要从链接中提取域或第一级子域名与正则表达式提取域或子域PHP

www.google.com -> google.com 
www.maps.google.com -> maps.google.com 
www.dev.maps.google.com - > maps.google.com 
www.dev.maps.google.com/show/maps - > maps.google.com 

我知道该怎么做只提取域名,但我挣扎写一个表达式会检测是否有子域名,并且只能得到第一个子域名 有人能告诉我正确的表达吗?

+1

你有任何示例代码? –

+4

技术上'www'仍然是'google.com'的子域名。因此,“www.google.com”将评估为“www.google.com”。 –

+0

切断www可能更为明智。 preg替换前 –

回答

0

我不能想出一个正则表达式来做你想做的事情,但是因为这个问题只是用php标记的,这里有一些php代码可以做你想做的事情。

此代码将拆分您输入“”,提取的最后部分的TLD和而忽略了可能的‘www’的部分从分裂串移一切都交给3个元素。最后,它将结合剩余的最多3个部分,这可以为您提供您想要的域,并且可能只有一个子域。

<?php 
$domain = 'www.dev.maps.google.com/asd/fgh'; 
$parts = explode('.', $domain); 

// extract tld 
preg_match('/([a-z]+)[^a-z]/', $parts[count($parts)-1], $tldMatches); 
$parts[count($parts)-1] = (isset($tldMatches[1])) 
    ? $tldMatches[1] 
    : $parts[count($parts)-1]; 

// remove www if present 
if ('www' === $parts[0]) { 
    array_shift($parts); 
} 

// define how many parts we have to ignore 
$splitHere = (count($parts) > 3) 
    ? count($parts) - 3 
    : 0; 

// output the desired parts combined with "." 
echo implode('.', array_slice($parts, $splitHere)) . PHP_EOL; 

此代码不适用于变音域名。

0

通常不建议使用基于正则表达式的方法来操作url字符串。业务的第一步是准备parse_url()的字符串,那么你将有一个坚实的基础从头开始。我使用explode()和数组函数来提取所需的结果。

代码:(Demo

$array=['google.com', // -> google.com 
     'www.google.com', // -> google.com 
     'www.maps.google.com', // -> maps.google.com 
     'www.dev.maps.google.com', // - > maps.google.com 
     'www.dev.maps.google.com/show/maps', // - > maps.google.com 
     'www.dev.maps.google.com?key=value', // - > maps.google.com 
]; 

foreach($array as $url){ 
    $host=parse_url("http://$url")['host'];  // reliable way to isolate host component only 
    $bits=explode('.',$host);      // split string on dots 
    if($bits[0]==='www'){       // check for www in first element 
     unset($bits[0]);       // remove first element 
    } 
    echo implode('.',array_slice($bits,-3)),"\n"; // extract maximum of 3 elements from end, rejoin with dots 
} 

输出:

google.com 
google.com 
maps.google.com 
maps.google.com 
maps.google.com 
maps.google.com 

此代码不写入验证输入字符串作为一个有效的URL。它假定你将有效的域名提供给它。如果你知道,那么在www.之后移动的唯一子字符串将是dev.,那么可以更直接地写出一种方法。