首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx结果在6个字符和7个(+)字符域之间存在差异

RegEx结果在6个字符和7个(+)字符域之间存在差异
EN

Stack Overflow用户
提问于 2016-07-20 16:28:18
回答 2查看 37关注 0票数 1

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

以下是代码:

代码语言:javascript
复制
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));

(产出)

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 17:36:16

您的regex将短域(如www.exampl.com )匹配为:

代码语言:javascript
复制
www         [a-zA-Z0-9\-\_]{1,63}
.           \.
exampl.com  [a-z\.]{2,10}$

较长的域,如www.example.com,其中只有最后一部分符合[a-z\.]{2,10}的10个字符限制,匹配如下:

代码语言:javascript
复制
www         NOT MATCHED
.           NOT MATCHED
example     [a-zA-Z0-9\-\_]{1,63}
.           \.
com         [a-z\.]{2,10}$

之所以会出现这种情况,是因为regex试图尽早匹配,因此只要有可能,就会包括www

如果您想通常返回最后两个部分,但对于一些特殊情况(如co.uk ),则可以使用以下方法。但是由于这需要在regex中列出所有二级域,所以这不是一个很好的解决方案。

代码语言:javascript
复制
'/[\w-]+\.(co\.uk|[a-z]+)$/'
票数 0
EN

Stack Overflow用户

发布于 2016-07-20 16:38:04

不要把你的生活复杂化,把getDomain改为

代码语言:javascript
复制
function getDomain($url = STR_EMP) {
    $parse = parse_url($url);
    return str_ireplace('www.', '', $parse['host']);;
}

目前的产出如下:

代码语言:javascript
复制
string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"

关于正则表达式,它不仅是长度问题,也是char类问题这里的演示

有关编辑的更新,可以使用以下代码:

代码语言:javascript
复制
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的最后一部分。

它产生:

代码语言:javascript
复制
string(11) "example.com"
string(8) "1234.com"
string(10) "exampl.com"
string(8) "site.com"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38485970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档