diff --git a/README.md b/README.md index c9ac868..5bdb0d1 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,8 @@ Below is list of all available validation rules * [min](#rule-min) * [max](#rule-max) * [between](#rule-between) +* [digits](#rule-digits) +* [digits_between](#rule-digits_between) * [url](#rule-url) * [ip](#rule-ip) * [ipv4](#rule-ipv4) @@ -477,6 +479,16 @@ Value size calculated in same way like `min` rule. The field under this rule must have a size between min and max params. Value size calculated in same way like `min` and `max` rule. + +#### digits:value + +The field under validation must be numeric and must have an exact length of `value`. + + +#### digits_between:min,max + +The field under validation must have a length between the given `min` and `max`. + #### url diff --git a/src/Rules/Digits.php b/src/Rules/Digits.php new file mode 100644 index 0000000..b0f673f --- /dev/null +++ b/src/Rules/Digits.php @@ -0,0 +1,24 @@ +requireParameters($this->fillable_params); + + $length = (int) $this->parameter('length'); + + return ! preg_match('/[^0-9]/', $value) + && strlen((string) $value) == $length; + } + +} diff --git a/src/Rules/DigitsBetween.php b/src/Rules/DigitsBetween.php new file mode 100644 index 0000000..44d5183 --- /dev/null +++ b/src/Rules/DigitsBetween.php @@ -0,0 +1,27 @@ +requireParameters($this->fillable_params); + + $min = (int) $this->parameter('min'); + $max = (int) $this->parameter('max'); + + $length = strlen((string) $value); + + return ! preg_match('/[^0-9]/', $value) + && $length >= $min && $length <= $max; + } + +} diff --git a/src/Validator.php b/src/Validator.php index 80c5046..bff4a0b 100644 --- a/src/Validator.php +++ b/src/Validator.php @@ -107,6 +107,8 @@ protected function registerBaseValidators() 'lowercase' => new Rules\Lowercase, 'uppercase' => new Rules\Uppercase, 'json' => new Rules\Json, + 'digits' => new Rules\Digits, + 'digits_between' => new Rules\DigitsBetween, 'defaults' => new Rules\Defaults, 'default' => new Rules\Defaults, // alias of defaults ]; diff --git a/tests/Rules/DigitsBetweenTest.php b/tests/Rules/DigitsBetweenTest.php new file mode 100644 index 0000000..f84e694 --- /dev/null +++ b/tests/Rules/DigitsBetweenTest.php @@ -0,0 +1,29 @@ +rule = new DigitsBetween; + } + + public function testValids() + { + $this->assertTrue($this->rule->fillParameters([2, 6])->check(12345)); + $this->assertTrue($this->rule->fillParameters([2, 3])->check(12)); + $this->assertTrue($this->rule->fillParameters([2, 3])->check(123)); + $this->assertTrue($this->rule->fillParameters([3, 5])->check('12345')); + } + + public function testInvalids() + { + $this->assertFalse($this->rule->fillParameters([4, 6])->check(12)); + $this->assertFalse($this->rule->fillParameters([1, 3])->check(12345)); + $this->assertFalse($this->rule->fillParameters([1, 3])->check(12345)); + $this->assertFalse($this->rule->fillParameters([3, 6])->check('foobar')); + } + +} diff --git a/tests/Rules/DigitsTest.php b/tests/Rules/DigitsTest.php new file mode 100644 index 0000000..2523144 --- /dev/null +++ b/tests/Rules/DigitsTest.php @@ -0,0 +1,27 @@ +rule = new Digits; + } + + public function testValids() + { + $this->assertTrue($this->rule->fillParameters([4])->check(1243)); + $this->assertTrue($this->rule->fillParameters([6])->check(124567)); + $this->assertTrue($this->rule->fillParameters([3])->check('123')); + } + + public function testInvalids() + { + $this->assertFalse($this->rule->fillParameters([7])->check(12345678)); + $this->assertFalse($this->rule->fillParameters([4])->check(12)); + $this->assertFalse($this->rule->fillParameters([3])->check('foo')); + } + +}