【问题标题】:How to recognize youtube or vimeo site by url?如何通过 url 识别 youtube 或 vimeo 网站?
【发布时间】:2012-09-23 06:41:24
【问题描述】:

我在 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”视频的有效格式是什么,以便我可以相应地应用逻辑。

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

【问题讨论】:

    标签: php drupal-6


    【解决方案1】:

    我一直在跨多个项目调整这些正则表达式以匹配 Youtube 和 Vimeo URL。它们都非常适合匹配,您可以使用 PHP 的 preg_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
    

    【讨论】:

      【解决方案2】:

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

      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/);
      

      如果字符串匹配,match 将有一个匹配值数组,如果不匹配,则null

      【讨论】:

      • 感谢您的回答,但是如果用户输入的 url 没有 http 或 www.
      • 感谢您的描述。我会检查的。
      • 我认为你可以使用任何东西作为分隔符。标准是“/”,但你必须转义斜杠,所以这里不使用“/”会使其更具可读性
      • 检查编辑。如果对您的问题有帮助,请接受答案。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2017-05-23
        • 2019-01-31
        • 2012-12-29
        • 1970-01-01
        • 2021-06-04
        相关资源
        最近更新 更多