Php RegEx结果在6个字符和7个(+;)字符域之间有所不同
我有一个非常简单的函数来获取URL的域。我从返回的字符串中查找的只是域名(不是“www.example.com”,而是“example.com”) 我正在测试这个函数,除了长度小于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
http://www.example.com/asdf.html
--OUT:example.com
输入:http://www.1234.com/asdf
--OUT:1234.com
输入:http://www.exampl.com/asdf
--OUTwww.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你将如何处理willwww.to.us
vswww.example.co.uk
?我只想to.us
,和example.co.uk
@TJB4rn3s请阅读,(比如.co.uk
)并记录在案。你确定你已经准备好开发真正的防弹解决方案了吗?哥们!我没有想到{2,10}标准匹配较短的域。。。有道理,谢谢。我将把这个标记为答案,因为您已经指出了这一点,但我将根据这个示例完全修改getDomain函数
'/[\w-]+\.(co\.uk|[a-z]+)$/'