diff --git a/src/Domains/Domain.php b/src/Domains/Domain.php index e503508..3f7d088 100644 --- a/src/Domains/Domain.php +++ b/src/Domains/Domain.php @@ -46,6 +46,13 @@ class Domain */ protected $sub = ''; + /** + * PSL rule matching suffix + * + * @var string + */ + protected $rule = ''; + /** * Domain Parts * @@ -105,11 +112,29 @@ public function getSuffix(): string return $this->suffix; } - for ($i = 3; $i > 0; $i--) { - $joined = \implode('.', \array_slice($this->parts, $i * -1)); + for ($i = 0; $i < count($this->parts); $i++) { + $joined = \implode('.', \array_slice($this->parts, $i)); + $next = \implode('.', \array_slice($this->parts, $i + 1)); + $exception = '!'.$joined; + $wildcard = '*.'.$next; + + if (\array_key_exists($exception, self::$list)) { + $this->suffix = $next; + $this->rule = $exception; + + return $next; + } if (\array_key_exists($joined, self::$list)) { $this->suffix = $joined; + $this->rule = $joined; + + return $joined; + } + + if (\array_key_exists($wildcard, self::$list)) { + $this->suffix = $joined; + $this->rule = $wildcard; return $joined; } @@ -118,6 +143,14 @@ public function getSuffix(): string return ''; } + public function getRule(): string + { + if (! $this->rule) { + $this->getSuffix(); + } + return $this->rule; + } + /** * Returns registerable domain name */ @@ -176,7 +209,7 @@ public function getSub(): string */ public function isKnown(): bool { - if (\array_key_exists($this->getSuffix(), self::$list)) { + if (\array_key_exists($this->getRule(), self::$list)) { return true; } @@ -188,7 +221,7 @@ public function isKnown(): bool */ public function isICANN(): bool { - if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'ICANN') { + if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'ICANN') { return true; } @@ -200,7 +233,7 @@ public function isICANN(): bool */ public function isPrivate(): bool { - if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'PRIVATE') { + if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'PRIVATE') { return true; } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 9cebcfb..28e3f59 100755 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -211,4 +211,148 @@ public function testHTTPSException2(): void new Domain('https://facbook.com'); } + + public function testExampleExampleCk(): void + { + $domain = new Domain('example.example.ck'); + + $this->assertEquals('example.example.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('example.ck', $domain->getSuffix()); + $this->assertEquals('example.example.ck', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testSubSubExampleExampleCk(): void + { + $domain = new Domain('subsub.demo.example.example.ck'); + + $this->assertEquals('subsub.demo.example.example.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('example.ck', $domain->getSuffix()); + $this->assertEquals('example.example.ck', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('subsub.demo', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWwwCk(): void + { + $domain = new Domain('www.ck'); + + $this->assertEquals('www.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('ck', $domain->getSuffix()); + $this->assertEquals('www.ck', $domain->getRegisterable()); + $this->assertEquals('www', $domain->getName()); + $this->assertEquals('', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testSubSubWwwCk(): void + { + $domain = new Domain('subsub.demo.www.ck'); + + $this->assertEquals('subsub.demo.www.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('ck', $domain->getSuffix()); + $this->assertEquals('www.ck', $domain->getRegisterable()); + $this->assertEquals('www', $domain->getName()); + $this->assertEquals('subsub.demo', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWildcardNomBr(): void + { + $domain = new Domain('sub.example.com.nom.br'); + + $this->assertEquals('sub.example.com.nom.br', $domain->get()); + $this->assertEquals('br', $domain->getTLD()); + $this->assertEquals('com.nom.br', $domain->getSuffix()); + $this->assertEquals('example.com.nom.br', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWildcardKawasakiJp(): void + { + $domain = new Domain('sub.example.com.kawasaki.jp'); + + $this->assertEquals('sub.example.com.kawasaki.jp', $domain->get()); + $this->assertEquals('jp', $domain->getTLD()); + $this->assertEquals('com.kawasaki.jp', $domain->getSuffix()); + $this->assertEquals('example.com.kawasaki.jp', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testExceptionKawasakiJp(): void + { + $domain = new Domain('sub.city.kawasaki.jp'); + + $this->assertEquals('sub.city.kawasaki.jp', $domain->get()); + $this->assertEquals('jp', $domain->getTLD()); + $this->assertEquals('kawasaki.jp', $domain->getSuffix()); + $this->assertEquals('city.kawasaki.jp', $domain->getRegisterable()); + $this->assertEquals('city', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWildcardPrivateDomain(): void + { + $domain = new Domain('sub.example.com.dev.adobeaemcloud.com'); + + $this->assertEquals('sub.example.com.dev.adobeaemcloud.com', $domain->get()); + $this->assertEquals('com', $domain->getTLD()); + $this->assertEquals('com.dev.adobeaemcloud.com', $domain->getSuffix()); + $this->assertEquals('example.com.dev.adobeaemcloud.com', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(false, $domain->isICANN()); + $this->assertEquals(true, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testPrivateDomain(): void + { + $domain = new Domain('sub.example.adobeaemcloud.net'); + + $this->assertEquals('sub.example.adobeaemcloud.net', $domain->get()); + $this->assertEquals('net', $domain->getTLD()); + $this->assertEquals('adobeaemcloud.net', $domain->getSuffix()); + $this->assertEquals('example.adobeaemcloud.net', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(false, $domain->isICANN()); + $this->assertEquals(true, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } }