【问题标题】:How to create a custom youtube url form validator如何创建自定义 youtube url 表单验证器
【发布时间】:2012-10-01 17:48:30
【问题描述】:

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

然后我在我的MyForm.class.php 中使用它:new 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;
    }
  }
}

但它根本不起作用。

此外,如果我的验证器可以检查 youtube 视频是否存在,那就太好了。

【问题讨论】:

  • 问题是doClean(函数名是明确的)应该返回给定的值cleaned。因此,您不必返回truefalse,而是返回$url,或者如果它无效则抛出一个新异常(正如@Vlad Jula-Nedelcu 所说)。顺便说一句,不要忘记在你的配置方法中调用parent::configure($options, $messages);
  • 谢谢 j0k,关于选项和消息,我可以在验证器或表单操作中设置无效和必需吗?
  • 在您的表单和验证器中的消息中是必需的。

标签: php symfony-1.4 validation


【解决方案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)。

【讨论】:

  • 我很快就会测试它,但我不确定它是否会起作用,因为代码看起来是一样的。我的选项和信息呢,我做对了吗?
  • 当值无效时,验证器总是会引发 sfValidatorError 异常。请参阅 symfony 的 sfValidatorBase 中的 doClean 方法:* @param mixed $value The input value/* @return mixed The cleaned value / * @throws sfValidatorError。这意味着当有效时,验证器应返回 url(在您的情况下),如果无效,则抛出 sfValidatorError
  • 这是否意味着返回值将是XXXXXXXXX而不是http://www.youtube.com/watch?v=XXXXXXXXXX
  • @VladJula-Nedelcu 以及您如何处理这样的 Youtube 链接:http://youtu.be/2YJk_D3GD_A
  • @VladJula-Nedelcu 问题不在于添加新条件,问题在于您将有大量条件来处理所有 youtube 案例,例如:http://www.youtube.com/v/2YJk_D3GD_A?version=3&hl=en_UShttp://www.youtube.com/embed/2YJk_D3GD_A、@ 987654332@等..
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2014-09-06
  • 2020-01-08
  • 1970-01-01
相关资源
最近更新 更多