我有一个非常简单的功能来获取URL的域名。我从返回的字符串中寻找的只是域名(不是'www.example.com',而是'example.com')。
我正在测试该功能,除了长度不足7个字符的域外,它似乎没问题。
以下是我的示例输入和输出:
IN:http://www.example.com/asdf.html
- OUT:example.com
IN:http://www.1234.com/asdf
- OUT:1234.com
IN:http://www.exampl.com/asdf
- OUT www.exampl.com
让我失望的是最后的输入/输出。我不明白为什么当域少于7个字符时函数返回www.
。
以下是代码:
function getDomain($url = STR_EMP) {
preg_match("/[a-zA-Z0-9\-\_]{1,63}\.[a-z\.]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
return $_domain_tld[0];
}
$url1 = "http://www.example.com/asdf.html"; // example.com
$url2 = "http://www.1234.com/asdf"; //1234.com
$url3 = "http://www.exampl.com/asdf"; // www.exampl.com
var_dump(getDomain($url1), getDomain($url2), getDomain($url3));
(输出)
string(11) "example.com"
string(8) "1234.com"
string(14) "www.exampl.com"
我不是RegEx的专家,但似乎6个字母的域符合表达式中的{1,63}标准。有人可以解释为什么6个字符www.exampl.com
域名正在返回www.
?
我是否可以使用RegEx来防止缩短网址?
先谢谢。
更新:
域名标准:
some.site.com
应输出site.com
a.nother.site.com
也应输出site.com
答案 0 :(得分:2)
不要过度复杂化您的生活,将getDomain
更改为
function getDomain($url = STR_EMP) {
$parse = parse_url($url);
return str_ireplace('www.', '', $parse['host']);;
}
现在输出:
string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"
关于你的正则表达式,它不仅是一个长度问题,它也是一个char类问题demo here
关于您的编辑的更新,您可以使用此代码:
function getDomain($url = STR_EMP) {
preg_match("/[\\w-]{1,63}\\.[a-z]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
return $_domain_tld[0];
}
$url1 = "http://www.example.com/asdf.html";
$url2 = "http://www.1234.com/asdf";
$url3 = "http://www.exampl.com/asdf";
$url4 = "http://a.nother.site.com";
var_dump(getDomain($url1), getDomain($url2), getDomain($url3), getDomain($url4));
我将正则表达式更新为仅匹配TLD的最后部分。
它产生:
string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"
string(8) "site.com"
答案 1 :(得分:0)
您的正则表达式将www.exampl.com
等短域匹配为:
www [a-zA-Z0-9\-\_]{1,63}
. \.
exampl.com [a-z\.]{2,10}$
www.example.com
等较长的域名,其中最后一部分符合[a-z\.]{2,10}
的10个字符的限制,其匹配为:
www NOT MATCHED
. NOT MATCHED
example [a-zA-Z0-9\-\_]{1,63}
. \.
com [a-z\.]{2,10}$
这是因为正则表达式尝试尽早匹配,所以只要有可能www
就会包含在内。
如果你想通常返回最后两个部分,但是对于像co.uk这样的特殊情况,最后3个你可以使用以下内容。但由于这需要列出正则表达式中的所有二级域名,因此这不是一个好的解决方案。
'/[\w-]+\.(co\.uk|[a-z]+)$/'