2011-10-11 70 views
23

我得到這個代碼從鏈接YouTube的ID喜歡 www.youtube.com/watch?v=xxxxxxx正從一個鏈接

URL youtubeURL = new URL(link); 
    youtubeURL.getQuery(); 

YouTube的ID基本上這很容易讓我的ID v = XXXXXXXX

但我注意到某個YouTube的鏈接將是這樣

http://gdata.youtube.com/feeds/api/videos/xxxxxx 

我正在從文件中的鏈接 所以我需要建立一個正則表達式或這是一個解析器來幫助我嗎?

+0

你可能想看看[我的回答一個非常類似的問題](http://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string/5831191 #5831191)。它從各種YouTube網址格式中提取視頻ID。 – ridgerunner

+0

@ridgerunner謝謝,但它錯過了gdata鏈接 – Peril

+0

謝謝指出。我已更新[我的YouTube ID匹配表達式](http://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string/5831191#5831191),以便它現在正確匹配你的'gdata'子域範例。 – ridgerunner

回答

39

試過其他的人,但在我的情況下失敗 - 調整了正則表達式來適應我的網址

String pattern = "(?<=watch\\?v=|/videos/|embed\\/)[^#\\&\\?]*"; 

    Pattern compiledPattern = Pattern.compile(pattern); 
    Matcher matcher = compiledPattern.matcher(url); 

    if(matcher.find()){ 
     return matcher.group(); 
    } 

這一個適用於:(你也可以實現一個安全檢查youtubeid長度= 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

+0

謝謝soooooooooooooooo太多了! – Pkmmte

+3

不適用於youtu.be/ID鏈接。 – Konsumierer

+2

這不是很美,但是在這裏你可以:'(?<= watch \?v = |/videos/| embed \/| youtu.be \/| \/v \/| watch \?v%3D | %2Fvideos%2F |嵌入%2F | youtu.be%2F |%2Fv%2F)[^#\&\?\ n] * – kritzikratzi

5

此正則表達式會做的伎倆:

(?<=videos\/|v=)([\w-]+) 

這意味着,我們首先尋找video/v=然後捕獲所有以下字符可以在字(字母,數字和下劃線)和連字符。

例中的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 
+0

這不會讓我唯一的id – Peril

+0

使用'http://gdata.youtube.com/feeds/api/videos/xxxxxx'作爲indata我得到'xTmi7zzUa-M'作爲輸出。我誤解了你的問題嗎?你是在問一個正則表達式,它可以讓你解析'v = xxxxxxxx'和另一個? – Marcus

+0

其實。這個正則表達式適用於這兩種情況。你會得到什麼結果? – Marcus

1

不知道完整的規範所有可能的YouTube網址,這似乎爲您提供的示例工作:

//*EDIT* - fixed to hopefully support more recent youtube link styles/formats: 
(?<=watch\?v=|/videos/|/embed/|youtu.be/)[^&#?]* 

...匹配PjDw3azfZWI來自以下任一URL:

http://www.youtube.com/watch?v=PjDw3azfZWI#t=31m08s 
http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI 

您需要多一點得到那個特定的信息,如果你不知道這些是來自YouTube,儘管這是一個非常快速的檢查

請記住,如果你想只用getQuery()方法的結果,將無法從http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI URL中提取結果,因爲此URL沒有查詢部分。

Java示例:

Pattern rex = Pattern.compile("(?<=watch\\?v=|/videos/)[^&#]*"); 
Matcher m = rex.matcher(link); 
String YouTubeVideoID = m.group(); 
+0

不適用於http://youtu.be/6UW3xuJinEg這種類型的網址 –

+0

@krishan的確沒有(當我問他這個問題時,這甚至不是一個有效的URL)但是如果你對於'youtu.be'以及'/ embed /'鏈接:'(?<= watch \?v = |/videos/|/embed/| youtu.be /)[#&# ?](我會更新我的答案) - 請讓我知道,如果沒有,就像我剛剛用手做的那樣... –

+0

我得到了一個關於這個問題的解決方案http:// stackoverflow。 com/questions/25718304/how-to-you-you-video-id-from-url-with-java/ –

5
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; 
} 
+0

適合我... –

0

這不使用正則表達式,但還是應該做的工作。

/** 
* Returns the video id of a YouTube watch link. 
*/ 
public static String getVideoId(String watchLink) 
{ 
    return watchLink.substring(watchLink.length() - 11); 
} 
0
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; 
} 
1

這是爲我工作

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; 
} 

來源link

2

從這個link得到了更好的解決方案。

使用以下方法從鏈接中獲取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; 
    } 
} 

希望這有助於。