如何创建自定义youtube url表单验证程序

时间:2012-10-01 17:48:31

标签: php symfony-1.4 validation

我想创建一个自定义表单验证程序,以检查我的用户是否正在发送youtube网址。 我已经创建了lib/validator/youtubeValidator.class.php

然后我在MyForm.class.phpnew YoutubeValidator(........)

中使用它

以下是代码:

class YoutubeValidator extends sfValidatorUrl
{
  protected function configure($options = array(), $messages = array())
  {
    $this->addMessage('invalid', 'Veuillez entrer un lien Youtube');
  }
  protected function doClean($url)
  {
    $pattern = 
      '%^# Match any youtube URL
      (?:https?://)?  # Optional scheme. Either http or https
      (?:www\.)?      # Optional www subdomain
      (?:             # Group host alternatives
        youtu\.be/    # Either youtu.be,
      | youtube\.com  # or youtube.com
        (?:           # Group path alternatives
          /embed/     # Either /embed/
        | /v/         # or /v/
        | /watch\?v=  # or /watch\?v=
        )             # End path alternatives.
      )               # End host alternatives.
      ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
      $%x'
      ;

    $result = preg_match($pattern, $url, $matches);
    if (false !== $result)
    {
      return $matches[1];
    }
    return false;

    if (false !== $result)
    {
      throw new sfValidatorError($this, 'invalid', array('value' => $value));
    }
    else
    {
      return true;
    }
  }
}

但它根本不起作用。

此外,如果我的验证员可以检查你的视频是否存在,那可能会很棒。

1 个答案:

答案 0 :(得分:1)

您可能需要将最后一行更改为以下内容:

$result = preg_match($pattern, $url, $matches);
if (false === $result)
{
   throw new sfValidatorError($this, 'invalid', array('value' => $url));
}

return $url;

这只会检查用户提交的网址是否是youtube网址(如果它与您的正则表达式匹配)。如果不是,将抛出异常。


<强>更新 - 删除 -


更新2

class YoutubeValidator extends sfValidatorUrl
{
  protected function configure($options = array(), $messages = array())
  {
    parent::configure($options, $messages);

    $this->setMessage('invalid', 'Veuillez entrer un lien Youtube');
  }

  protected function doClean($value)
  {
    $pattern = "/(http(s)?:\/\/)?(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/";

    preg_match($pattern, $value, $matches);

    if (empty($matches[3]))
    {
      throw new sfValidatorError($this, 'invalid', array('value' => $value));
    }

    return $matches[3];
  }
}

我已经对它进行了测试,似乎工作正常(使用$form->getValues()时返回实际的视频ID)。