使用 jQuery 从 URL 获取 YouTube 视频 ID

Posted

技术标签:

【中文标题】使用 jQuery 从 URL 获取 YouTube 视频 ID【英文标题】:Get YouTube video id from URL with jQuery 【发布时间】:2011-07-22 17:33:56 【问题描述】:

我正在尝试采用 textarea 输入,该输入将任何 YouTube URL 作为输入并像 Facebook 一样嵌入视频。

我有:

var text = $('#content').val().split(' ');
    for (i = 0; i < text.length; i++) 
        var test = text[i].indexOf('youtube.com/watch');
        var check = text[i].indexOf('[youtube=');

        if (test != -1 && check == -1) 
            var ytid = text[i].substring(text[i].lastIndexOf('=') + 1);
            text[i] = '[youtube=' + ytid + ']';
        
    
var boxval = text.join(' ').trim();

它采用任何 YouTube URL 并将其转换为 [youtube=videoid]。那么问题是,当 URL 提交时带有 &lt;br&gt;\n 最后它会添加 ]

有人知道更好的方法吗?

【问题讨论】:

你的问题不完整我认为“然后我使用.....” 您的逻辑不适用于 http://www.youtube.com/watch?v=gzDS-Kfd5XQ&amp;feature=youtube_gdata_player 等 URL,尽管它是合法的 YouTube 视频 URL。 【参考方案1】:

最近有人问了一个类似的问题(但该问题需要 php 解决方案)。这是 my solution to that question 的 javascript 版本:

// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs(text) 
    /* Commented regex (in PHP syntax)
    $text = preg_replace('%
        # Match any youtube URL in the wild.
        (?: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)  # $1: Allow 10-12 for 11 char youtube id.
        \b               # Anchor end to word boundary.
        [?=&\w]*         # Consume any URL (query) remainder.
        (?!              # But don\'t match URLs already linked.
          [\'"][^<>]*>   # Not inside a start tag,
        | </a>           # or <a> element text contents.
        )                # End negative lookahead assertion.
        %ix', 
        '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>',
        $text);
    */
    // Here is the same regex in JavaScript literal regexp syntax:
    return text.replace(
        /(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=))([\w\-]10,12)\b[?=&\w]*(?!['"][^<>]*>|<\/a>)/ig,
        '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>');

您可以轻松修改替换字符串以转换为 BBCode 而不是 html

【讨论】:

【参考方案2】:

正则表达式的救援:

var text = (
"http://www.youtube.com/watch?v=gzDS-Kfd5XQ\n" +
"http://www.youtube.com/watch?v=gzDS-Kfd5XQ&feature=youtube_gdata_player\n" +
"http://www.youtube.com/watch?feature=youtube_gdata_player&v=gzDS-Kfd5XQ\n" +
"http://www.youtube.com/watch?v=gzDS-Kfd5XQ http://www.youtube.com/watch?v=gzDS-Kfd5XQ"
).split(/\s+/);
for (var i = 0; i < text.length; i++) 
    var url = text[i];
    if (/^https?\:\/\/.+/i.test(url)) 
        var temp = /[\?\&]v=([^\?\&]+)/.exec(url);
        if (temp) 
            text[i] = '[youtube=' + temp[1] + ']';
         else 
            text[i] = "URL found but does not contain video id";
        
     else 
        // other case left as an exercise
    

alert(text.join('\n'));

从here借来的代码。

【讨论】:

【参考方案3】:

使用jQuery.trim 去除ytid 变量中的空格

【讨论】:

【参考方案4】:

尝试使用查询字符串解析辅助方法:

var boxval = getParameterByName("v", $('#content').val());

Helper方法(借自here):

function getParameterByName(name, url)

  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(url);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));

【讨论】:

以上是关于使用 jQuery 从 URL 获取 YouTube 视频 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 从 URL 中获取端口号?

如何使用 jQuery 从 URL 中获取端口号?

使用jQuery从URL获取查询字符串[重复]

如何使用 jQuery 从 URL 中获取锚点?

使用jQuery从iframe中的url获取标题字符串?

如何使用jquery从url获取文件大小[重复]