diff --git a/README.md b/README.md index 8d9a4b1..9fab776 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ if($v->validate()) { * `dateFormat` - Field is a valid date in the given format * `dateBefore` - Field is a valid date and is before the given date * `dateAfter` - Field is a valid date and is after the given date + * `contains` - Field is a string and contains the given string ## Adding Custom Validation Rules diff --git a/composer.json b/composer.json index 7990087..3fba12d 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "vlucas/valitron", - "version": "1.0.1", + "version": "1.0.2", "type": "library", "description": "Simple, elegant, stand-alone validation library with NO dependencies", "keywords": ["validation", "validator", "valid"], diff --git a/lang/en.php b/lang/en.php index ac657cc..755761a 100644 --- a/lang/en.php +++ b/lang/en.php @@ -22,6 +22,7 @@ return array( 'date' => "Invalid date", 'dateFormat' => "Must be date with format '%s'", 'dateBefore' => "Must be date before '%s'", - 'dateAfter' => "Must be date after '%s'" + 'dateAfter' => "Must be date after '%s'", + 'contains' => "Must contain %s" ); diff --git a/src/Valitron/Validator.php b/src/Valitron/Validator.php index 3282e4f..c90fe5a 100644 --- a/src/Valitron/Validator.php +++ b/src/Valitron/Validator.php @@ -23,6 +23,7 @@ class Validator const ERROR_DEFAULT = 'Invalid'; + protected $validUrlPrefixes = array('http://', 'https://', 'ftp://'); /** * Setup validation @@ -241,6 +242,25 @@ class Validator return !$this->validateIn($field, $value, $params); } + /** + * Validate a field contains a given string + * + * @param string $field + * @param mixed $value + * @param array $params + * @return bool + */ + protected function validateContains($field, $value, $params) + { + if(!isset($params[0])) { + return false; + } + if (!is_string($params[0]) || !is_string($value)) { + return false; + } + return (strpos($value, $params[0]) !== false); + } + /** * Validate that a field is a valid IP address * @@ -274,7 +294,12 @@ class Validator */ protected function validateUrl($field, $value) { - return filter_var($value, FILTER_VALIDATE_URL) !== false; + foreach ($this->validUrlPrefixes as $prefix) { + if(strpos($value, $prefix) !== false) { + return filter_var($value, FILTER_VALIDATE_URL) !== false; + } + } + return false; } /** @@ -286,9 +311,14 @@ class Validator */ protected function validateUrlActive($field, $value) { - $url = str_replace(array('http://', 'https://', 'ftp://'), '', strtolower($value)); + foreach ($this->validUrlPrefixes as $prefix) { + if(strpos($value, $prefix) !== false) { + $url = str_replace($prefix, '', strtolower($value)); - return checkdnsrr($url); + return checkdnsrr($url); + } + } + return false; } /** @@ -420,7 +450,18 @@ class Validator */ public function error($field, $msg, array $params = array()) { - $this->_errors[$field][] = vsprintf($msg, $params); + $values = array(); + // Printed values need to be in string format + foreach($params as $param) { + if(is_array($param)) { + $param = "['" . implode("', '", $param) . "']"; + } + if($param instanceof \DateTime) { + $param = $param->format('Y-m-d'); + } + $values[] = $param; + } + $this->_errors[$field][] = vsprintf($msg, $values); } /** diff --git a/tests/Valitron/Validate.php b/tests/Valitron/Validate.php index d70a573..be59089 100644 --- a/tests/Valitron/Validate.php +++ b/tests/Valitron/Validate.php @@ -396,5 +396,26 @@ class ValidateTest extends \PHPUnit_Framework_TestCase $v->rule('dateAfter', 'date', '2013-01-28'); $this->assertFalse($v->validate()); } + + public function testContainsValid() + { + $v = new Validator(array('test_string' => 'this is a test')); + $v->rule('contains', 'test_string', 'a test'); + $this->assertTrue($v->validate()); + } + + public function testContainsNotFound() + { + $v = new Validator(array('test_string' => 'this is a test')); + $v->rule('contains', 'test_string', 'foobar'); + $this->assertFalse($v->validate()); + } + + public function testContainsInvalidValue() + { + $v = new Validator(array('test_string' => 'this is a test')); + $v->rule('contains', 'test_string', array('test')); + $this->assertFalse($v->validate()); + } }