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

时间:2016-07-20 16:28:19

标签: php regex

我有一个非常简单的功能来获取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

2 个答案:

答案 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]+)$/'