From 5989197329f278f39e2862d437f3ef5a5f6f76ef Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Thu, 12 Aug 2021 01:38:10 +0800 Subject: [PATCH] feat: extract domain info from url --- db/allTlds.db | Bin 0 -> 65536 bytes functions/ExtractDomain.php | 77 +++++++++++++++++++ {lib => functions}/Punycode.php | 0 redisCache.php => functions/RedisCache.php | 0 tgInterface.php => functions/TgInterface.php | 0 main.php | 7 +- 6 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 db/allTlds.db create mode 100644 functions/ExtractDomain.php rename {lib => functions}/Punycode.php (100%) rename redisCache.php => functions/RedisCache.php (100%) rename tgInterface.php => functions/TgInterface.php (100%) diff --git a/db/allTlds.db b/db/allTlds.db new file mode 100644 index 0000000000000000000000000000000000000000..510ac62a1e81c586a1c8db29c7395fc464c23b9a GIT binary patch literal 65536 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 z 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'./db/allTlds.db'); // 顶级域名数据库 + } +} + +class extractDomain { + private function getAllTlds() { // 获取所有顶级域 含次级域 + $db = new tldDB; + $res = $db->query('SELECT tld FROM `tlds`;'); + while ($row = $res->fetchArray(SQLITE3_ASSOC)) { + $tlds[] = $row['tld']; + } + return $tlds; // Unicode字符使用Punycode编码 + } + + private function isDomain($domain) { // 检测是否为域名 + preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/', $domain, $match); + return (count($match) != 0); + } + + private function getDomain($url) { // 从URL获取域名 + $url = preg_replace('/^[\w]+:\/\//', '', $url); // 去除协议字段 + $url = explode('?', $url)[0]; // 去除请求参数内容 + $domain = explode('/', $url)[0]; // 分离域名 + return (new Punycode)->encode($domain); + } + + private function getTld($domain) { // 搜索域名TLD + $tlds = $this->getAllTlds(); // 获取TLD列表 + foreach ($tlds as $tld) { + if (substr($domain, -strlen($tld)) === $tld) { // 匹配测试 + $target[] = $tld; + } + } + if (count($target) === 0) { + return ''; // 匹配不到TLD + }; + $type = 0; + foreach ($target as $tld) { // 遍历可能的结果 + $num = substr_count($tld, '.'); + if ($type < $num) { // 获取.个数最多的 + $type = $num; + $result = $tld; + } + } + return $result; // 返回网站顶级域名 + } + + private function getSite($domain, $tld) { // 获取主域名 + $domain = explode('.', $domain); + $num = count($domain) - substr_count($tld, '.'); + return $domain[$num - 1] . $tld; + } + + public function analyse($url) { // 分析域名信息 + $domain = $this->getDomain($url); + if (!$this->isDomain($domain)) { // 域名不合格 + return array(); + } + $tld = $this->getTld($domain); + if ($tld == '') { // 匹配不到TLD + return array( + 'domain' => $domain + ); + } + return array( + 'domain' => $domain, + 'tld' => $tld, + 'site' => $this->getSite($domain, $tld) + ); + } +} + +?> diff --git a/lib/Punycode.php b/functions/Punycode.php similarity index 100% rename from lib/Punycode.php rename to functions/Punycode.php diff --git a/redisCache.php b/functions/RedisCache.php similarity index 100% rename from redisCache.php rename to functions/RedisCache.php diff --git a/tgInterface.php b/functions/TgInterface.php similarity index 100% rename from tgInterface.php rename to functions/TgInterface.php diff --git a/main.php b/main.php index 7604ba0..70f9b45 100644 --- a/main.php +++ b/main.php @@ -1,9 +1,10 @@