【问题标题】:symfony form validation clean with regex before validate with regex在使用正则表达式验证之前使用正则表达式清理 symfony 表单验证
【发布时间】:2010-09-21 10:31:04
【问题描述】:

我正在使用 Symfony 1.4,在表单验证方面有点卡住。我有一个像下面这样的验证器:

$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 验证器。

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

【问题讨论】:

    标签: regex symfony1 validation symfony-forms


    【解决方案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/validator/sfValidatorMobilePhone.class.php。然后您可以将其称为

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

    【讨论】:

    • 我同意在这里编写自己的验证器是可行的方法。
    【解决方案2】:

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

    如果您无法在验证之前执行“清理步骤”,您可以尝试像这样进行验证:

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

    这将匹配恰好包含 11 个数字(以及任意多个非数字字符)的任何字符串,其中前两个必须是 07

    【讨论】:

    • 是的,我需要在验证之前进行清理步骤,用于清理的实际正则表达式不是问题,但是尝试将清理和验证结合起来会变得更加棘手!