正则从URL中提取一级域名,支持大部分域名

JSON 2018-02-27 09:47:02 61255

在改造ICP备案系统的同时,优化一些用户体验,其中查询域名ICP备案,只需要使用一级域名查询即可,原系统不会做区分,导致数据有点混乱,今天就要把这个问题解决掉。

ICP备案查询:https://icp.sojson.com

正则思路

基础正则表达式:([a-z0-9--]{1,200})\.([a-z]{2,10})(\.[a-z]{2,10})? ,为了清晰表达就不用替代表达式了。

解说:

1、([a-z0-9--]{1,200}),域名的主干部分。比如 sojson.com,就是为了匹配 sojson部分。

2、\.,匹配sojson.com 中间的点“.”。

3、([a-z]{2,10}),匹配 sojson.com 中的后置“com”。

4、(\.[a-z]{2,10})?,匹配如有多级后缀,如sojson.com.cn 的“.cn”,后面加问好“?”表示可以有或者没有。

如果有同学测试了就知道,这个不是很合理,因为他会匹配前面的二级、三级域名之类的。因为是从头开始。正则有从后开始的设置,我不会,也测试了下,效果不明显,而且如果当url带参数。https://icp.sojson.com/?q=www.baidu.com ,从后查找就会获取到了www.baidu.com。这明显不是我想要的。

正则长篇大论法

最终我选择了这个,我把国内常用的域名都写清楚。从前往后查找,暂时这么用,有好建议希望提出来。在下面留言。

直接上代码:

public static void main(String[] args) {
    String url = "https://www.sojson.com/regex/generate";
    String pattern  = "([a-z0-9--]{1,200})\\.(ac.cn|bj.cn|sh.cn|tj.cn|cq.cn|he.cn|sn.cn|sx.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|zj.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sc.cn|gz.cn|yn.cn|gs.cn|qh.cn|nx.cn|xj.cn|tw.cn|hk.cn|mo.cn|xz.cn" +
            "|com.cn|net.cn|org.cn|gov.cn|我爱你|在线|中国|网址|网店|中文网|公司|网络|集团" +
            "|com|cn|cc|org|net|xin|xyz|vip|shop|top|club|wang|fun|info|online|tech|store|site|ltd|ink|biz|group|link|work|pro|mobi|ren|kim|name|tv|red" +
            "|cool|team|live|pub|company|zone|today|video|art|chat|gold|guru|show|life|love|email|fund|city|plus|design|social|center|world|auto)";


    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(url);
    while (m.find()){
        url = m.group();
    }
    System.out.println(url);
}

有个小注意点,需要把多级结尾的域名写在前面。因为正则匹配也是从前往后匹配的。

可能有的人不知道,gx.cn 这种结尾的是什么,是我国各种省份的域名,比如gx.cn就是广西省的。

优化版

还是有点问题,用获取Host方式,再次加工了一次。封装后代码如下:

/**
 * 从URL中从前到后提取 一级域名
 * @param url
 * @return
 */
public static String getDomainByUrl(String url){
    if(isBlank(url)){
        return url;
    }
    String pattern  = "([a-z0-9--]{1,200})\\.(ac.cn|bj.cn|sh.cn|tj.cn|cq.cn|he.cn|sn.cn|sx.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|zj.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sc.cn|gz.cn|yn.cn|gs.cn|qh.cn|nx.cn|xj.cn|tw.cn|hk.cn|mo.cn|xz.cn" +
            "|com.cn|net.cn|org.cn|gov.cn|.com.hk|我爱你|在线|中国|网址|网店|中文网|公司|网络|集团" +
            "|com|cn|cc|org|net|xin|xyz|vip|shop|top|club|wang|fun|info|online|tech|store|site|ltd|ink|biz|group|link|work|pro|mobi|ren|kim|name|tv|red" +
            "|cool|team|live|pub|company|zone|today|video|art|chat|gold|guru|show|life|love|email|fund|city|plus|design|social|center|world|auto|.rip|.ceo|.sale|.hk|.io|.gg|.tm|.gs|.us)$";


    if(url.startsWith("http:")||url.startsWith("https:")){
        url =  getHost(url);
    }else{
        url =  getHost("http://" +url);
    }
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(url);
    while (m.find()){
        url = m.group();
    }
    return url;
}

有好的建议在下面留言。谢谢!

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/276.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Java 正则获取一级域名
Java获取域名,Java从URL地址中获取域名,Java从Request 获取域名
Nginx 跳转到www二级域名域名重定向配置方法。
Java 实现多个二级域名访问同个Tomcat(系统)。
根据域名获取IP地址,Java 获取域名的IP地址
IE、Firefox对同域名访问并发限制,及解决优化方案
单个项目多个二级域名简单实现思路
查询任意域名是否是阿里云备案接入 API
网站域名检测有哪些好处?
网站域名检测有哪些好处?
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...