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 の Web サイトにこれに関するガイドがあります: 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 個の数字 (および任意の数の数字以外の文字) を含む任意の文字列に一致し、そのうちの最初の 2 つは07.

于 2010-09-21T11:41:34.293 に答える