2

だから私はZend_Frameworkを使用していて、テキストを検証して、数字や通常の文字だけでなく、「ã」、「ç」などの人も受け入れる必要があります...

単純な正規表現の検証でうまくいくと確信していました。

    public function SetTitle($title) 
    {
      $validator = new Zend_Validate_Regex('/^[0-9a-zA-ZÀ-ú]+[0-9A-Za-zÀ-ú\'\-\.:,; ]{1,50}$/');

      if ($validator->isValid($title)) {
        if ($this->title != $title) {
            $this->title = $title;
        }
      } else {
        throw new MyApp_Projects_ProjectException("This ($title) is not a valid title.");
      }

} //SetTitle

そして、以下に報告されたいくつかの考えの後で、私が次のようなものをテストしたとき、それは本当にうまくいきました:

public function testIfCanAttributeTitleToProject()
{            
    $someTitle = "some title with ç, á and ã";
    $this->project->SetTitle($someTitle);
    $this->assertEquals($this->project->getTitle(), $someTitle);
}

しかし、次のように、フォームでデータをチェックするためのバリデーターを追加しようとすると、次のようになります。

    $title = new Zend_Form_Element_Text('title');
    $title->setLabel('Nome:')
        ->setOptions(array('size' => '50'))
        ->setRequired(true)
        ->addValidator('Regex', false, array(
            'pattern' => "/^[0-9a-zA-ZÀ-ú]+[0-9A-Za-zÀ-ú\'\-\.,: ]{1,50}$/"
            ))
        ->addFilter('HtmlEntities')
        ->addFilter('StringTrim');
    // attach elements to form
    $this->addElement($title);

テストしようとするとエラーが発生します

public function testUserCanUseAccentedCharacters() {

   $form = new MyApp_Form_ProjectCreate();
   $formData = array(
       'title' => 'we scream to weird chars like ã é or ç',
       'submit' => true
       );
    $form->process($formData);
}

ここで、プロセス関数は次のようになります。

public function process($data) 
{
    if ($this->isValid($data) !== true) {
        throw new MyApp_Form_ProjectCreateException('Invalid data!');
    } else {
        $db = Zend_Registry::get('db');
        $projectMapper = new MyApp_Projects_ProjectMapper($db);        
        $project = new MyApp_Projects_Project();
        $project->SetTitle($this->title->GetValue());
        $projectMapper->insert($project);
    }
}

私はすでに他のコンテキストで正規表現をチェックして再テストしましたが、問題ないようですが、何らかの理由で、Zend_Validate自体がこの式で機能する場合でも、フォーム要素内のバリデーターはÀ-ú範囲内の何も受け入れません。 。

確かに私は(まだ)ここで基本的な何かを失っています...または私がより良い方法があるときに壁に頭をぶつけています...

誰か助けてくれませんか?

TIA、もう一度... :)

4

1 に答える 1

1
'/^[0-9a-zA-ZÀ-ú]+[0-9A-Za-zÀ-ú\'\-\. ]{1,50}$/'

一重引用符を埋め込みます。これはあなたのために働きますか?

"/^[0-9a-zA-ZÀ-ú]+[0-9A-Za-zÀ-ú\'\-\. ]{1,50}$/"

アップデート

さらに3つのことを試してください。Zendによる正規表現の実装の詳細がわからないため、最初の2つが機能するかどうかはわかりません。

Unicodeレタープロパティ:

"/^([0-9]\p{Letter})+([0-9\'\-\. ]\p{Letter}){1,50}$/"

Posixキャラクタークラス:

"/^([0-9][[:alpha:]])+([0-9\'\-\. ][[:alpha:]]){1,50}$/"

気になる文字のブルートフォース列挙:

"/^[0-9a-zA-ZÀÁÂ ...et cetera... øùú]+[0-9A-Za-zÀÁÂ ...et cetera... øùú\'\-\. ]{1,50}$/"
于 2012-05-01T16:59:03.577 に答える