我想创建一个自定义表单验证程序,以检查我的用户是否正在发送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;
}
}
}
但它根本不起作用。
此外,如果我的验证员可以检查你的视频是否存在,那可能会很棒。
答案 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)。