1

我在 drupal 中创建了一个表单,其中有一个名为“URL”的字段。现在该站点的用户将在此处输入任何 url。现在通过该用户输入的网址,我只想验证它是否是正确的 youtube 或 vimeo 网址。示例如下:

网址:www.youtube.com/video_Id 网址:www.vimeo.com

我可以通过使用 strstr 或 preg_match 等 php 函数轻松识别它。但假设有人输入他的博客的 URL,其中讲述了 youtube 可能如下 - www.learnyoutube.comwww.mysite/about_youtube.com等。

在上述情况下,我的验证将失败,因为 url 字符串包含 youtube。

所以最后我只想知道' youtube '和' vimeo '视频的有效格式是什么,以便我可以相应地应用逻辑。

如果有人也有其他想法,请帮忙。

4

3 回答 3

4

我一直在跨多个项目调整这些正则表达式以匹配 Youtube 和 Vimeo URL。它们都非常适合匹配,您可以使用 PHPpreg_match来获取整个 URL 或仅获取视频 ID。我在我的项目中使用它从视频 URL 中获取 ID,并格式化比默认嵌入提供的更好的 Youtube 播放器。

/**
 * Fetches the ID of a Vimeo video given a URL
 *
 * @param string $source  Vimeo URL
 *
 * @return mixed          A video ID if matched, otherwise false
 */
function video_id_from_vimeo_url($source)
{
    $pattern = "/^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/is";
    $matches = array();
    preg_match($pattern, $source, $matches);
    if (isset($matches[1])) return $matches[1];
    return false;
}

/**
 * Fetches the ID of a YouTube video given a URL
 *
 * @param string $source  YouTube URL
 *
 * @return mixed          A video ID if matched, otherwise false
 */
function video_id_from_youtube_url($source)
{
    $pattern = '/^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/is';
    $matches = array();
    preg_match($pattern, $source, $matches);
    if (isset($matches[1])) return $matches[1];
    return false;
}

/**
 * Generate a URL to a YouTube video with a YouTube video ID
 *
 * @param string $id     YouTube video ID
 * @param array $params  Query params to send to video
 *
 * @return string        A YouTube URL
 */
function youtube_video_url_with_id($id, array $params = array())
{
    $query = empty($params) ? '' : '?' . http_build_query($params);
    return esc_url("//youtube.com/embed/{$id}{$query}");
}

/**
 * Generate a URL to a Vimeo video with a Vimeo video ID
 *
 * @param string $id     Vimeo video ID
 * @param array $params  Query params to send to video
 *
 * @return string        A Vimeo URL
 */
function vimeo_video_url_with_id($id, array $params = array())
{
    $defaults = array(
        'color'    => 'ffffff',
        'title'    => 0,
        'byline'   => 0,
        'portrait' => 0,
    );
    $params = array_merge($defaults, $params);

    $query = empty($params) ? '' : '?' . http_build_query($params);
    return "//player.vimeo.com/video/{$id}{$query}";
}

应匹配所有形式的 Youtube URL。示例使用:

$url = "https://www.youtube.com/watch?v=buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE

$url = "http://youtu.be/buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE

$fmt_url = youtube_video_url_with_id($id);

或 Vimeo 网址:

$id = video_id_from_vimeo_url('https://vimeo.com/ondemand/afilmaboutcoffee/112360104'); // 112360104
$id = video_id_from_vimeo_url('https://vimeo.com/112360104'); // 112360104

我使用这些函数和正则表达式的组合来匹配正确的格式化程序,然后输出一个漂亮的视频。在我最近的 Ember 应用程序中,我有一个 Javascript 组件,它观察 URL 的变化,然后更新 HTML 输出以显示视频的预览。使用与 PHP 版本相同的 RegEx。像这样的东西(咖啡脚本):

  YOUTUBE_EXPR = /^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/i
  VIMEO_EXPR   = /^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/i
于 2014-11-07T23:33:10.507 回答
2

您可以只匹配url开头的域部分

preg_match('#^((http://)|(https://)){0,1}(www\.){0,1}youtube\.com#', $url)

这就是这个 preg 的工作原理:

^ - everything after this should be at the very beginning
( - start sub pattern which can be "http://" or "https://"
   (http://)
   | - OR       
   (https://)
) - end subpattern 
{0,1} - look for 0 to 1 occurrences of the previous subpattern
(www\.){0,1} - look for 0 to 1 occurrences of "www."
youtube\.com - look for "youtube.com"

它将匹配以以下开头的任何内容:

http(s)://www.youtube.com
http(s)://youtube.com
www.youtube.com
youtube.com

编辑:JavaScript 版本:

var site= 'http://www.youtube.com';
var match = site.match(/^((http:\/\/)|(https:\/\/)){0,1}(www\.){0,1}youtube\.com/);

matchnull如果字符串匹配或不匹配,将有一个匹配值数组。

于 2012-09-23T07:00:59.057 回答
1

我认为您正在使用嵌入字段。如果是,则嵌入将自动验证正确的 youtube 或视频(您必须检查配置页面上的站点)url。如果否,那么 Pinetree 已经正确解释了它,所以使用它。

于 2013-01-07T15:06:49.647 回答