2010-09-21 140 views
0

我正在使用Symfony 1.4,并且对表单验证有点困惑。我有一个验证,如下所示:symfony表单验证与正则表达式使用正则表达式验证之前

$this->setValidator('mobile_number', new sfValidatorAnd(array(
    new sfValidatorString(array('max_length' => 13)), 
    new sfValidatorRegex(array('pattern' => '/^07\d{9}$/'), 
    array('invalid' => 'Invalid mobile number.')), 
) 
)); 

这是一个简单的正则表达式匹配英国手机号码。

但是我的问题是,如果有人提交了这样一个字符串:“07 90 44 65 48 1”,则正则表达式会失败,但是如果字符串被清除以便首先删除空格,则它们会给出一个有效数字。

我的问题是,我不知道在symfony表单框架内的什么地方我会做到这一点。

我需要从用户输入中除去所有数字,然后使用我的mobile_number验证器。

任何想法将不胜感激。谢谢。

回答

0

我不知道Symfony,所以我不知道如何去清理输入。如果您可以以某种方式执行基于正则表达式的搜索和替换,则可以搜索/\D+/并将其替换为空 - 这将删除除字符串中的数字之外的所有内容。小心,它也会删除可能相关的(?)前导+

如果你不能做验证之前,“清洁步骤”,你可以尝试验证这样的:

/^\D*07(?:\d*\d){9}\D*$/ 

这将匹配正好包含11个数字(和任意多无任何字符串数字字符),其中前两个需要是07

+0

是的我需要在验证之前的清洗步骤,清洗的实际正则表达式不是问题,但试图结合清洗和验证会变得更加棘手! – Del 2010-09-21 12:14:33

1

您可以使用标准验证程序的组合来完成此操作,但它可能最容易构建自己的自定义验证程序。有一个引导这个symfony的网站上:http://www.symfony-project.org/more-with-symfony/1_4/en/05-Custom-Widgets-and-Validators#chapter_05_building_a_simple_widget_and_validator

我想大概应该是这个样子:

class sfValidatorMobilePhone extends sfValidatorBase 
{ 
    protected function doClean($value) 
    { 
     $value = preg_replace('/\s/','',$value); 

     if (
      (0 !== strpos($value, '07')) || 
      (13 < strlen($value)) || 
      (0 !== preg_match('/[^\d]/', $value)) 
      ) 
     { 
      throw new sfValidatorError($this, 'invalid', array('value' => $value)); 
     } 
     else 
     { 
      return $value; 
     } 
    } 
} 

保存为LIB /识别/ sfValidatorMobilePhone.class.php。你可以称之为

$this->setValidator('mobile_number', new sfValidatorMobilePhone()); 
+0

我同意在这里写你自己的验证器是要走的路。 – 2010-09-21 16:01:27