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}$/"

更新

还有三件事要尝试。不知道Zend实现正则表达式的细节,所以不知道前两个能不能用。

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 回答