Php 在可能不包含协议的字符串上运行parse_url()

Php 在可能不包含协议的字符串上运行parse_url(),php,url,parse-url,Php,Url,Parse Url,我试图从用户输入的URL字符串中获取域名和TLD(无子域),该字符串可能有协议、目录、子域、文件名等,也可能没有 换言之,考虑到以下任一情况: example.com www.example.com sub.example.com example.com/whatever/hey.html http://example.com https://subdomain.example.com ftp://example.com/whatever/hey.html 我应该总是以:example.com

我试图从用户输入的URL字符串中获取域名和TLD(无子域),该字符串可能有协议、目录、子域、文件名等,也可能没有

换言之,考虑到以下任一情况:

example.com
www.example.com
sub.example.com
example.com/whatever/hey.html
http://example.com
https://subdomain.example.com
ftp://example.com/whatever/hey.html
我应该总是以:
example.com
结束

现在我正在做的就是:

$hostParts = explode('.', parse_url($URL, PHP_URL_HOST));
$tld = array_pop($hostParts);
$domain = array_pop($hostParts);
$domain = $domain . "." . $tld;

但是,如果提供的URL没有协议,则会中断。在这种情况下,
parse\u url
为什么无法获取主机?

根据定义,url包含协议或方案。检查//是否存在,如果不存在,则将//前置到字符串。这在PHP<5.4.7中可能有所不同,因此可能需要添加http://if-no协议。

我可以看出您是对的。以下是我使用的代码:
if(strpos($URL,“:/”)==false和&substr($URL,0,1)!=“/”{$URL=“http:/”$URL;}
只需将它放在代码的第一行之前,它就可以工作了。可能更简单一点:
$URL=(strpos($urlString,“/”==false)?“//$urlString”:$urlString