我有一个非常简单的函数来获取URL的域。我从返回的字符串中寻找的只是域名(不是'www.example.com',而是'example.com')。
我正在测试这个功能,除了7个字符长的域外,它似乎很好。
以下是我的样本输入和输出:
输入:http://www.example.com/asdf.html -- OUT:example.com
输入:http://www.1234.com/asdf -- OUT:1234.com
IN:http://www.exampl.com/asdf - OUT http://www.exampl.com/asdf
让我失望的是最后的输入/输出。我不明白当域小于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,我可以乱搞,以防止这种情况下,较短的URL?
谢谢你的进阶。
更新:
该领域的标准:
some.site.com应该输出site.com
a.nother.site.com还应该输出site.com
发布于 2016-07-20 17:36:16
您的regex将短域(如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}$之所以会出现这种情况,是因为regex试图尽早匹配,因此只要有可能,就会包括www。
如果您想通常返回最后两个部分,但对于一些特殊情况(如co.uk ),则可以使用以下方法。但是由于这需要在regex中列出所有二级域,所以这不是一个很好的解决方案。
'/[\w-]+\.(co\.uk|[a-z]+)$/'发布于 2016-07-20 16:38:04
不要把你的生活复杂化,把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类问题这里的演示
有关编辑的更新,可以使用以下代码:
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));在其中,我更新了regex,使其只匹配TLD的最后一部分。
它产生:
string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"
string(8) "site.com"https://stackoverflow.com/questions/38485970
复制相似问题