Проверка формы Symfony очищается с помощью регулярного выражения перед проверкой с помощью регулярного выражения - PullRequest
0 голосов
/ 21 сентября 2010

Я использую 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» регулярное выражение не будет выполнено, но они дали правильный номер, если строка была очищена для удаления пробела вначале.

Моя проблема в том, что я не знаю, где находится в форме SymfonyFramework Я хотел бы сделать это.

Мне нужно убрать все, кроме чисел из пользовательского ввода, а затем использовать мой валидатор mobile_number.

Любые идеи будут с благодарностью.Спасибо.

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Вы можете сделать это с помощью комбинации стандартных валидаторов, но вполне может быть проще создать свой собственный валидатор. На веб-сайте 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());
0 голосов
/ 21 сентября 2010

Я не знаю Symfony, поэтому я не знаю, как бы вы пошли о чистке ввода. Если вы можете каким-то образом выполнять поиск и замену на основе регулярных выражений, вы можете найти /\D+/ и заменить его ничем - это удалит все, кроме цифр, из вашей строки. Осторожно, он также удалит ведущий +, который может иметь значение (?).

Если вы не можете выполнить «шаг очистки» перед проверкой, попробуйте выполнить проверку следующим образом:

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

Это будет соответствовать любой строке, которая содержит ровно 11 чисел (и произвольно много нечисловых символов), первые два из которых должны быть 07.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...