Php RegEx结果在6个字符和7个(+;)字符域之间有所不同

Php RegEx结果在6个字符和7个(+;)字符域之间有所不同,php,regex,Php,Regex,我有一个非常简单的函数来获取URL的域。我从返回的字符串中查找的只是域名(不是“www.example.com”,而是“example.com”) 我正在测试这个函数,除了长度小于7个字符的域之外,它似乎还可以 以下是我的输入和输出示例: 输入:http://www.example.com/asdf.html--OUT:example.com 输入:http://www.1234.com/asdf--OUT:1234.com 输入:http://www.exampl.com/asdf--OUTw

我有一个非常简单的函数来获取URL的域。我从返回的字符串中查找的只是域名(不是“www.example.com”,而是“example.com”)

我正在测试这个函数,除了长度小于7个字符的域之外,它似乎还可以

以下是我的输入和输出示例:

输入:
http://www.example.com/asdf.html
--OUT:
example.com

输入:
http://www.1234.com/asdf
--OUT:
1234.com

输入:
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));
(产出)

我不是正则表达式的专家,但6个字母的域似乎符合表达式中的{1,63}标准。有人能解释一下为什么6个字符的
www.exampl.com
域返回
www.

是否有一个正则表达式我可以乱搞,以防止较短的网址

提前谢谢

更新:

域的标准:

some.site.com
应该输出
site.com


a.other.site.com
也应该输出
site.com

不要让你的生活过于复杂,将
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));
在其中,我更新了正则表达式,使其仅与TLD的最后一部分匹配

它产生:

string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"
string(8) "site.com"

您的正则表达式将短域(如
www.exampl.com
as)匹配为:

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),您可以使用以下方法返回最后3个零件。但由于这需要在regex中列出所有二级域,所以这不是一个好的解决方案

'/[\w-]+\.(co\.uk|[a-z]+)$/'

首先,正确地转义正则表达式预期输出的标准是什么?如果输入是
some.site.com
,您只想
site.com
还是
some.site.com
(应该只剥离
www.
)?那
a.longer.one.com
呢?您想要
one.com
longer.one.com
?我想要
site.com
one.com
,对不起。我会试试@anubhava谢谢我在上面添加了更多信息。。。但是使用这个函数,
http://asdfasdf.example.com/asdf
给了我一个
asdfasdf.example.com
的输出,我只是在这里寻找
example.com
,它似乎在正确的轨道上,但是如果我输入
www.exampl.co.uk
它只返回
co.uk
。我注意到您从
[a-z\.]{2,10}
部分删除了
\.
。。这在大多数情况下都有效@ThomasAyoub@TJB4rn3s你将如何处理will
www.to.us
vs
www.example.co.uk
?我只想
to.us
,和
example.co.uk
@TJB4rn3s请阅读,(比如
.co.uk
)并记录在案。你确定你已经准备好开发真正的防弹解决方案了吗?哥们!我没有想到{2,10}标准匹配较短的域。。。有道理,谢谢。我将把这个标记为答案,因为您已经指出了这一点,但我将根据这个示例完全修改getDomain函数
'/[\w-]+\.(co\.uk|[a-z]+)$/'