views:

98

answers:

2

Hi, I'm using Symfony 1.4 and am a little stuck regarding form validation. I have a validator like the one below:

$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.')),
  )
));

That is a simple regex for matching a UK mobile phone number.

However my problem is that if someone submitted a string like this: "07 90 44 65 48 1" the regex would fail but they have given a valid number if a the string was cleaned to remove whitespace first.

My problem is that I don't know where within the symfony form framework I would accomplish this.

I need to strip everything but numbers from the user input and then use my mobile_number validator.

Any ideas would be greatly appreciated. Thanks.

A: 

I don't know Symfony, so I don't know how you would go about cleaning the input. If you can do a regex-based search-and-replace somehow, you can search for /\D+/ and replace that with nothing - this will remove everything except digits from your string. Careful, it would also remove a leading + which might be relevant (?).

If you can't do a "cleaning step" before the validation, you could try validating it like this:

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

This will match any string that contains exactly 11 numbers (and arbitrarily many non-number characters), the first two of which need to be 07.

Tim Pietzcker
yeah I need the cleaning step before the validation, the actual regex for cleaning is not a problem, but trying to combine the cleaning and validation gets a lot trickier!
Del
+1  A: 

You may be able to do this with a combination of standard validators, but it might well be easiest to construct your own custom validator. There is a guide to this on the symfony website: http://www.symfony-project.org/more-with-symfony/1_4/en/05-Custom-Widgets-and-Validators#chapter_05_building_a_simple_widget_and_validator

I think it should probably look something like this:

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;
        }
    }
}

Save this as lib/validator/sfValidatorMobilePhone.class.php. You could then call it as

$this->setValidator('mobile_number', new sfValidatorMobilePhone());
lonesomeday
I agree that writing your own validator here is the way to go.
jeremy