PHP:从String中删除http://,http:// www,https://,https://并获取域名和TLD

时间:2016-04-03 14:37:18

标签: php regex preg-replace

我想在PHP中创建一个删除所有输入的函数,例如

http://
https://
http://www.
https://www.
http://xyz.

来自给定的域名,如

example.com

并返回一个如下数组:

'name' => 'example'
'tld' => 'com'

任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:1)

我认为您不需要删除协议 www 甚至子域,您只需提取 URL中的名称 tdl 。所以试试这个:

RegEx解决方案:

<?php

$url  = 'https://www.example.com#anchor';
$host = parse_url($url, PHP_URL_HOST);  // www.example.com
preg_match('/(\w+)\.(\w+)$/', $host, $matches);
$array_result = array ( "name" => $matches[1],
                        "tld"  => $matches[2] );
print_r($array_result);

Online Demo

没有RegEx:

<?php

$url  = 'https://www.example.com#anchor';
$host = parse_url($url, PHP_URL_HOST);  // www.example.com
$host_names = explode(".", $host);
$array_result = array ( "name" => $host_names[count($host_names)-2],
                        "tld"  =>  $host_names[count($host_names)-1] );
print_r($array_result);

Online Demo

/*
 Output:
 *    Array
 *    (
 *        [name] => example
 *        [tld] => com
 *    ) 
*/

答案 1 :(得分:1)

尝试以下正则表达式:

(?:^|\s)(?:https?:\/\/)?(?:\w+(?=\.).)?(?<name>.*).(?<tld>(?<=\.)\w+)

请参阅https://regex101.com/r/lI2lB4/2

上的演示

如果您输入

www.google.com
mail.yahoo.com.in
http://microsoft.com
http://www.google.com
http://mail.yahoo.co.uk

捕获的内容将是:

MATCH 1
name       = `google`
tld        = `com`

MATCH 2
name       = `yahoo.com`
tld        = `in`

MATCH 3
name       = `microsoft`
tld        = `com`

MATCH 4
name       = `google`
tld        = `com`

MATCH 5
name       = `yahoo.co`
tld        = `uk`

答案 2 :(得分:0)

提取真实TLD的正确方法是使用运行Public Suffix List的包,只有这样才能正确提取具有二级,三级TLD的域名(co.uk,a.bg,b.bg,等等。)。我建议使用TLD Extract

以下是示例代码:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('http://mail.yahoo.co.uk');
$result->getSubdomain(); // will return (string) 'mail'
$result->getHostname(); // will return (string) 'yahoo'
$result->getSuffix(); // will return (string) 'co.uk'