Browse Source

[GENERIC] Zend_Validate_Regex:

- added pattern check BEFORE validation to prevent exceptions within the isValid method

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21571 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 years ago
parent
commit
789444c7d9
2 changed files with 18 additions and 7 deletions
  1. 15 4
      library/Zend/Validate/Regex.php
  2. 3 3
      tests/Zend/Validate/RegexTest.php

+ 15 - 4
library/Zend/Validate/Regex.php

@@ -34,6 +34,7 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
 {
     const INVALID   = 'regexInvalid';
     const NOT_MATCH = 'regexNotMatch';
+    const ERROROUS  = 'regexErrorous';
 
     /**
      * @var array
@@ -41,6 +42,7 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
     protected $_messageTemplates = array(
         self::INVALID   => "Invalid type given, value should be string, integer or float",
         self::NOT_MATCH => "'%value%' does not match against pattern '%pattern%'",
+        self::ERROROUS  => "There was an error while using the pattern '%pattern%'",
     );
 
     /**
@@ -61,6 +63,7 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
      * Sets validator options
      *
      * @param  string|Zend_Config $pattern
+     * @throws Zend_Validate_Exception On missing 'pattern' parameter
      * @return void
      */
     public function __construct($pattern)
@@ -95,11 +98,19 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
      * Sets the pattern option
      *
      * @param  string $pattern
+     * @throws Zend_Validate_Exception if there is a fatal error in pattern matching
      * @return Zend_Validate_Regex Provides a fluent interface
      */
     public function setPattern($pattern)
     {
         $this->_pattern = (string) $pattern;
+        $status         = @preg_match($this->_pattern, "Test");
+
+        if (false === $status) {
+            require_once 'Zend/Validate/Exception.php';
+            throw new Zend_Validate_Exception("Internal error while using the pattern '$this->_pattern'");
+        }
+
         return $this;
     }
 
@@ -109,7 +120,6 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
      * Returns true if and only if $value matches against the pattern option
      *
      * @param  string $value
-     * @throws Zend_Validate_Exception if there is a fatal error in pattern matching
      * @return boolean
      */
     public function isValid($value)
@@ -123,14 +133,15 @@ class Zend_Validate_Regex extends Zend_Validate_Abstract
 
         $status = @preg_match($this->_pattern, $value);
         if (false === $status) {
-            require_once 'Zend/Validate/Exception.php';
-            throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$value'");
+            $this->_error(self::ERROROUS);
+            return false;
         }
+
         if (!$status) {
             $this->_error(self::NOT_MATCH);
             return false;
         }
+
         return true;
     }
-
 }

+ 3 - 3
tests/Zend/Validate/RegexTest.php

@@ -96,12 +96,12 @@ class Zend_Validate_RegexTest extends PHPUnit_Framework_TestCase
      */
     public function testBadPattern()
     {
-        $validator = new Zend_Validate_Regex('/');
         try {
+            $validator = new Zend_Validate_Regex('/');
             $validator->isValid('anything');
             $this->fail('Expected Zend_Validate_Exception not thrown for bad pattern');
         } catch (Zend_Validate_Exception $e) {
-            $this->assertContains('Internal error matching pattern', $e->getMessage());
+            $this->assertContains('Internal error while', $e->getMessage());
         }
     }
 
@@ -110,7 +110,7 @@ class Zend_Validate_RegexTest extends PHPUnit_Framework_TestCase
      */
     public function testNonStringValidation()
     {
-        $validator = new Zend_Validate_Regex('/');
+        $validator = new Zend_Validate_Regex('/./');
         $this->assertFalse($validator->isValid(array(1 => 1)));
     }
 }