Www.youtube.com/watch?v=xxxxxxxのようなリンクからYouTubeIDを取得するためにこのコードを取得しました
URL youtubeURL = new URL(link);
youtubeURL.getQuery();
基本的にこれは私に簡単にIDを取得しますv = xxxxxxxx
しかし、私はいつかユーチューブのリンクがこのようになることに気づきました
http://gdata.youtube.com/feeds/api/videos/xxxxxx
フィードからリンクを取得しているので、そのための正規表現を作成する必要がありますか、それとも取得するためのパーサーがありますか?
他のものを試しましたが、私の場合は失敗しました-私のURLに合うように正規表現を調整しました
String pattern = "(?<=watch\\?v=|/videos/|embed\\/)[^#\\&\\?]*";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(url);
if(matcher.find()){
return matcher.group();
}
これは次の目的で機能します:(セキュリティチェックを実装することもできますyoutubeidlength = 11)
http://www.youtube.com/embed/Woq5iX9XQhA?html5=1
http://www.youtube.com/watch?v=384IUU43bfQ
http://gdata.youtube.com/feeds/api/videos/xTmi7zzUa-M&whatever
Woq5iX9XQhA
384IUU43bfQ
xTmi7zzUa-M
この正規表現はトリックを行います:
(?<=videos\/|v=)([\w-]+)
つまり、最初にvideo/
またはv=
を探してから、Wordに含めることができる次のすべての文字(文字、数字、アンダースコア)とハイフンをキャプチャします。
Javaの例:
public static void main(String[] args) {
String link = "http://gdata.youtube.com/feeds/api/videos/xTmi7zzUa-M&whatever";
String pattern = "(?:videos\\/|v=)([\\w-]+)";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(link);
if(matcher.find()){
System.out.println(matcher.group());
}
}
出力:
xTmi7zzUa-M
public static String getYoutubeVideoId(String youtubeUrl)
{
String video_id="";
if (youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http"))
{
String expression = "^.*((youtu.be"+ "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
CharSequence input = youtubeUrl;
Pattern pattern = Pattern.compile(expression,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
if (matcher.matches())
{
String groupIndex1 = matcher.group(7);
if(groupIndex1!=null && groupIndex1.length()==11)
video_id = groupIndex1;
}
}
return video_id;
}
そのパターンは私のために働いた:
"http(?:s?)://(?:www\.)?youtu(?:be\.com/watch\?v=|\.be/)([\w\-]+)(&(amp;)?[\w\?=]*)?"
ソース: YouTubeリンクの正規表現
これからより良い解決策を得ました リンク 。
次のメソッドを使用して、リンクからvideoIdを取得します。
YoutubeHelper.Java
import com.google.inject.Singleton;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;
@Singleton
public class YouTubeHelper {
final String youTubeUrlRegEx = "^(https?)?(://)?(www.)?(m.)?((youtube.com)|(youtu.be))/";
final String[] videoIdRegex = { "\\?vi?=([^&]*)","watch\\?.*v=([^&]*)", "(?:embed|vi?)/([^/?]*)", "^([A-Za-z0-9\\-]*)"};
public String extractVideoIdFromUrl(String url) {
String youTubeLinkWithoutProtocolAndDomain = youTubeLinkWithoutProtocolAndDomain(url);
for(String regex : videoIdRegex) {
Pattern compiledPattern = Pattern.compile(regex);
Matcher matcher = compiledPattern.matcher(youTubeLinkWithoutProtocolAndDomain);
if(matcher.find()){
return matcher.group(1);
}
}
return null;
}
private String youTubeLinkWithoutProtocolAndDomain(String url) {
Pattern compiledPattern = Pattern.compile(youTubeUrlRegEx);
Matcher matcher = compiledPattern.matcher(url);
if(matcher.find()){
return url.replace(matcher.group(), "");
}
return url;
}
}
お役に立てれば。
考えられるすべてのYouTubeURLの完全な仕様を知らなくても、これは提供した例では機能するようです。
_//*EDIT* - fixed to hopefully support more recent youtube link styles/formats:
(?<=watch\?v=|/videos/|/embed/|youtu.be/)[^&#?]*
_
...次のURLのいずれかから_PjDw3azfZWI
_に一致します。
_http://www.youtube.com/watch?v=PjDw3azfZWI#t=31m08s
http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI
_
これらがYouTubeからのものであることを知らなかった場合は、その特定の情報を取得するためにもう少し必要になりますが、それはかなり簡単なチェックです
getQuery()
メソッドの結果のみを使用しようとしている場合、このURLにはクエリがないため、_http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI
_ URLから結果を抽出できないことに注意してください。その一部...
Javaの例:
_Pattern rex = Pattern.compile("(?<=watch\\?v=|/videos/)[^&#]*");
Matcher m = rex.matcher(link);
String YouTubeVideoID = m.group();
_
これは私のために働いた
public static String getYoutubeVideoId(String youtubeUrl) {
String videoId = "";
if (youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) {
String expression = "^.*((youtu.be"+ "/)" + "|(v/)|(/u/w/)|(embed/)|(watch\\?))\\??v?=?([^#&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
Pattern pattern = Pattern.compile(expression,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(youtubeUrl);
if (matcher.matches()) {
String groupIndex1 = matcher.group(7);
if(groupIndex1!=null && groupIndex1.length()==11)
videoId = groupIndex1;
}
}
return videoId;
}
ソース リンク
This will work me and simple
public static String getVideoId(@NonNull String videoUrl) {
String reg = "(?:youtube(?:-nocookie)?\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(videoUrl);
if (matcher.find())
return matcher.group(1);
return null;
}
これは正規表現を使用しませんが、それでも機能するはずです。
/**
* Returns the video id of a YouTube watch link.
*/
public static String getVideoId(String watchLink)
{
return watchLink.substring(watchLink.length() - 11);
}