0

我正在使用 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 验证器。

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

4

2 回答 2

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());
于 2010-09-21T12:36:53.317 回答
0

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

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

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

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

于 2010-09-21T11:41:34.293 回答