PHP的parse_url()有一个主机字段,其中包含完整的主机.我正在寻找最可靠(也是最便宜)的方式来返回域和TLD.
举个例子:
http://www.google.com/foo,parse_url ()返回www.google.com for host
http://www.google.co.uk/foo,parse_url()返回www.google.co.uk主持人
我只想找google.com或google.co.uk.我已经考虑了一个有效的TLD /后缀表,只允许这些和一个单词.你会以其他方式做吗?有没有人知道这种事情的预先有效的REGEX?
这样的事情怎么样?
function getDomain($url) { $pieces = parse_url($url); $domain = isset($pieces['host']) ? $pieces['host'] : ''; if (preg_match('/(?P[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) { return $regs['domain']; } return false; }
将使用经典提取域名parse_url
,然后查找没有任何子域的有效域(www是子域).不会在'localhost'之类的东西上工作.如果不匹配则返回false.
//编辑:
尝试一下:
echo getDomain('http://www.google.com/test.html') . '
'; echo getDomain('https://news.google.co.uk/?id=12345') . '
'; echo getDomain('http://my.subdomain.google.com/directory1/page.php?id=abc') . '
'; echo getDomain('https://testing.multiple.subdomain.google.co.uk/') . '
'; echo getDomain('http://nothingelsethan.com') . '
';
它应该返回:
google.com google.co.uk google.com google.co.uk nothingelsethan.com
当然,如果它没有通过parse_url
,它将不会返回任何内容,因此请确保它是一个格式良好的URL.
//附录:
Alnitak是对的.上面提出的解决方案在大多数情况下都有效,但不一定都需要维护,例如,确保它们不是具有.morethan6字符的新TLD等等.提取域的唯一可靠方法是使用维护列表,例如http://publicsuffix.org/.一开始它更痛苦但长期更容易和更强大.您需要确保了解每种方法的优缺点以及它如何适合您的项目.
目前唯一"正确"的方法是使用http://publicsuffix.org/上保存的列表.
顺便说一句,这个问题也几乎与以下内容重复:
我可以改进有效域名的正则表达式检查吗?
从URL获取子域
IETF正在进行标准化工作,寻找DNS方法来声明DNS树中的特定节点是否用于"公共"注册,但它们还处于早期开发阶段.所有流行的非IE浏览器都使用publicsuffix.org列表.