diff --git a/src/Ulid.php b/src/Ulid.php index e961427..669788b 100644 --- a/src/Ulid.php +++ b/src/Ulid.php @@ -166,4 +166,13 @@ private function decodeTime(string $time): int return $carry; } + + public static function isValid(String $ulid) + { + if (strlen($ulid) !== static::TIME_LENGTH + static::RANDOM_LENGTH) { + return false; + } + + return !preg_match('/[^abcdefghjkmnpqrstvwxyz0-9]/i', $ulid); + } } diff --git a/tests/UlidTest.php b/tests/UlidTest.php index e05b433..ac7a119 100644 --- a/tests/UlidTest.php +++ b/tests/UlidTest.php @@ -144,4 +144,20 @@ public function testAddsRandomnessWhenGeneratedMultipleTimesByFromTimestamp(): v $this->assertEquals(substr($a, 0, -1), substr($b, 0, -1)); $this->assertNotEquals($a->getRandomness(), $b->getRandomness()); } + + public function testValidateUlid(): void + { + //contain invalidate letter i at the end + $res = Ulid::isValid('01b8kyr6g8bc61ce8r6k2t16hi'); + $res2 = Ulid::isValid('01b8kyr6g8bc61ce8r6k2t16hy'); + $res3 = Ulid::isValid('00000000000000000000longerthan26'); + $res4 = Ulid::isValid(Ulid::generate()); + $res5 = Ulid::isValid(Ulid::generate(true)); + + $this->assertFalse($res); + $this->assertTrue($res2); + $this->assertFalse($res3); + $this->assertTrue($res4); + $this->assertTrue($res5); + } }