我想要得到v=id从YouTube的URL与JavaScript(没有jQuery,纯JavaScript)。
YouTube URL格式示例
http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW
http://www.youtube.com/watch?v=u8nQa1cJyX8
或在URL中包含视频ID的任何其他YouTube格式。
这些格式的结果
u8nQa1cJyX8
我想要得到v=id从YouTube的URL与JavaScript(没有jQuery,纯JavaScript)。
YouTube URL格式示例
http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW
http://www.youtube.com/watch?v=u8nQa1cJyX8
或在URL中包含视频ID的任何其他YouTube格式。
这些格式的结果
u8nQa1cJyX8
当前回答
/^https?:\/\/(?:(?:youtu\.be\/)|(?:(?:www\.)?youtube\.com\/(?:(?:watch\?(?:[^&]+&)?vi?=)|(?:vi?\/)|(?:shorts\/))))([a-zA-Z0-9_-]{11,})/i
下面是一个优化的正则表达式,它可以找到视频id,并准确地遵循YouTube oEmbed对embed url的定义。您可以在这里看到我与测试url的匹配:https://regex101.com/r/q4mWg1/1
它故意不匹配协议相对url(//而不是https://)和youtu-nocookie.com url,因为这些不在oEmbed定义中,从而降低了性能。
你可以在这里查看oEmbed规范: https://oembed.com/
官方提供商的定义,包括YouTube的定义,在这里:https://oembed.com/providers.json
我发现这在Wordpress网站上非常有用,我需要在帖子内容中匹配oEmbed url。
其他回答
Java代码:(适用于所有url:
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o http://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0 http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s http://www.youtube.com/embed/0zM3nApSvMg?rel=0” http://www.youtube.com/watch?v=0zM3nApSvMg http://youtu.be/0zM3nApSvMg http://www.youtube.com/watch?v=0zM3nApSvMg/ http://www.youtube.com/watch?feature=player_detailpage&v=8UVNT4wvIGY
)
String url = "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index";
String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
Pattern compiledPattern = Pattern.compile(regExp);
Matcher matcher = compiledPattern.matcher(url);
if(matcher.find()){
int start = matcher.end();
System.out.println("ID : " + url.substring(start, start+11));
}
DailyMotion网站:
String url = "http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun";
String regExp = "/video/([^_]+)/?";
Pattern compiledPattern = Pattern.compile(regExp);
Matcher matcher = compiledPattern.matcher(url);
if(matcher.find()){
String match = matcher.group();
System.out.println("ID : " + match.substring(match.lastIndexOf("/")+1));
}
我对mantish的正则表达式做了一些轻微的更改,以包括来自J W和矩阵的答案的所有测试用例;因为一开始并不是对所有人都有效。可能还需要进一步的修改,但据我所知,这至少涵盖了大部分链接:
- (?): [&] vi ? = |嵌入- | \ / \ d d ? \ | - vi ? \ / | https: / \ / (?: www。)? youtu \。be /) ([^ & \ n ? # +) -
var url = ''; // get it from somewhere
var youtubeRegExp = /(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&\n?#]+)/;
var match = url.match( youtubeRegExp );
if( match && match[ 1 ].length == 11 ) {
url = match[ 1 ];
} else {
// error
}
进一步测试:
http://regexr.com/3fp84
试试NPM包youtube-id
测试在不同的网址:
const tested = [
'https://www.youtube.com/watch?v={YOUTUBE_ID}&nohtml5=False',
'https://youtu.be/{YOUTUBE_ID}',
'www.youtube.com/embed/{YOUTUBE_ID}'
// ....
]
我喜欢Surya的回答。只是一个行不通的案例……
String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
并不适用于
youtu.be/i4fjHzCXg6c and www.youtu.be/i4fjHzCXg6c
升级版:
String regExp = "/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
适用于所有人。
回答很好,但我最近发现,如果你试图在文本中找到你的youtube链接,并在youtube url后放置一些随机文本,regexp匹配的方式比需要的更多。改进的Chris Nolet回答:
- ^ * (?): youtu。be | u - v | \ \ \ w / |嵌入- | watch \ v ? =)([^#\&\?]{ 11,11})。* /