2010-09-21 137 views
0

我正在使用Symfony 1.4,並且對錶單驗證有點困惑。我有一個驗證,如下所示:symfony表單驗證與正則表達式使用正則表達式驗證之前

$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驗證器。

任何想法將不勝感激。謝謝。

回答

0

我不知道Symfony,所以我不知道如何去清理輸入。如果您可以以某種方式執行基於正則表達式的搜索和替換,則可以搜索/\D+/並將其替換爲空 - 這將刪除除字符串中的數字之外的所有內容。小心,它也會刪除可能相關的(?)前導+

如果你不能做驗證之前,「清潔步驟」,你可以嘗試驗證這樣的:

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

這將匹配正好包含11個數字(和任意多無任何字符串數字字符),其中前兩個需要是07

+0

是的我需要在驗證之前的清洗步驟,清洗的實際正則表達式不是問題,但試圖結合清洗和驗證會變得更加棘手! – Del 2010-09-21 12:14:33

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 /識別/ sfValidatorMobilePhone.class.php。你可以稱之爲

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

我同意在這裏寫你自己的驗證器是要走的路。 – 2010-09-21 16:01:27