youtube链接的正则表达式

时间:2010-09-15 11:24:19

标签: regex youtube

是否有某个正则表达式从(几乎)链接到Youtube的所有可能方式获取Youtube视频(不是嵌入对象)的链接?

我认为这是一个非常常见的问题,我确信有很多方法可以将其链接起来。

起点是:

19 个答案:

答案 0 :(得分:48)

到目前为止,我已经让Regular expression为我发布的示例工作了,它获得了第一组的ID:

http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?

答案 1 :(得分:11)

您可以使用下面的表达式。

(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)\&?

我正在使用它,它涵盖了最常用的网址。 我会在This Gist上不断更新。 您可以在tool上进行测试。

答案 2 :(得分:5)

我改进了上面与朋友发布的链接,我为IRC编写了一个脚本来识别甚至没有http的链接。它适用于我到目前为止所做的所有压力测试,包括带有几乎无法识别的YouTube网址的乱码文本,所以这里是:

~(?:https?://)?(?:www\.)?youtu(?:be\.com/watch\?(?:.*?&(?:amp;)?)?v=|\.be/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?~

答案 3 :(得分:3)

我测试了这里显示的所有正则表达式,没有一个可以覆盖我的客户端正在使用的所有url类型。

我通过试验和错误构建了这个,但它似乎适用于Poppy Deejay发布的所有模式。

"(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/)([a-zA-Z0-9_-]{11})+"

也许它可以帮助那些与我今天情况类似的人;)

答案 4 :(得分:3)

我最喜欢@brunodles的解决方案,但您仍然可以匹配非视频链接,例如https://www.youtube.com/feed/subscriptions

我采用了这种解决方案

(?:https?:\/\/)?(?:www\.)?youtu(?:\.be\/|be.com\/\S*(?:watch|embed)(?:(?:(?=\/[^&\s\?]+(?!\S))\/)|(?:\S*v=|v\/)))([^&\s\?]+)

它也可以用于匹配多个空格分隔的链接。 视频ID将在第一组中捕获。

使用以下网址进行了测试:

youtu.be/iwGFalTRHDA
youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=MoBL33GT9S8&feature=share
https://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
https://www.youtube.com/embed/watch?v=iwGFalTRHDA
https://www.youtube.com/embed/v=iwGFalTRHDA
https://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share

// will not match
https://www.youtube.com/feed/subscriptions
https://www.youtube.com/channel/UCgc00bfF_PvO_2AvqJZHXFg
https://www.youtube.com/c/NatGeoEdOrg/videos

https://regex101.com/r/mPyKKP/5

答案 5 :(得分:2)

我最近在使用atttribution_link网址时遇到了问题,所以我尝试制作适合自己的正则表达式。

这是我的正则表达式字符串:

(https?://)?(www\\.)?(yotu\\.be/|youtube\\.com/)?((.+/)?(watch(\\?v=|.+&v=))?(v=)?)([\\w_-]{11})(&.+)?

以下是我尝试过的一些测试用例:

http://www.youtube.com/watch?v=iwGFalTRHDA 
https://www.youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related 
http://youtu.be/iwGFalTRHDA 
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA 
www.youtu.be/iwGFalTRHDA 
youtu.be/iwGFalTRHDA 
youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related 
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ

另外请记住检查您为视频网址获取的字符串,有时可能会获得百分比字符。如果是这样,只需这样做

url = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

它应该修复它。

还要记住,youtube键的索引现在是索引9。

NSRange youtubeKey = [result rangeAtIndex:9]; //the youtube key
NSString * strKey = [url substringWithRange:youtubeKey] ;

答案 6 :(得分:1)

如果您设法涵盖所有​​链接格式,它将成为世界上最长的RegEx,但这里有一个可以帮助您开始,它将涵盖前几种链接格式:

http://(www\.)?youtube\.com/watch\?.*v=([a-zA-Z0-9]+).*

如果你需要解决问题,第二组将匹配视频ID。

答案 7 :(得分:1)

Fanmade上的小猪支持,这包括以下链接,包括origin_links的网址编码版本:

(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/|watch\%3Fv\%3D)([a-zA-Z0-9_-]{11})+



https://www.youtube.com/attribution_link?a=tolCzpA7CrY&u=%2Fwatch%3Fv%3DMoBL33GT9S8%26feature%3Dshare
https://www.youtube.com/watch?v=MoBL33GT9S8&feature=share
http://www.youtube.com/watch?v=iwGFalTRHDA 
https://www.youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related 
http://youtu.be/iwGFalTRHDA 
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA 
www.youtu.be/iwGFalTRHDA 
youtu.be/iwGFalTRHDA 
youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related 
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ

答案 8 :(得分:1)

我从这里获取了所有变体:

https://gist.github.com/rodrigoborgesdeoliveira/987683cfbfcc8d800192da1e73adc486#file-youtubeurlformats-txt

并构建了此正则表达式(YouTube ID在组2中):

(\/|%3D|v=|vi=)([0-9A-z-_]{11})[%#?&\s]

在这里检查:https://regexr.com/4u4ud

编辑:适用于不带中断的任何单个字符串。

答案 9 :(得分:0)

使用这个 Javascript 正则表达式,第一个捕获是视频 ID:

^(?:https?:)?(?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube(?:\-nocookie)?\.(?:[A-Za-z]{2,4}|[A-Za-z]{2,3}\.[A-Za-z]{2})\/)(?:watch|embed\/|vi?\/)*(?:\?[\w=&]*vi?=)?([^#&\?\/]{11}).*$

答案 10 :(得分:0)

    var isValidYoutubeLink: Bool{
        // working for all the youtube url's
        NSPredicate(format: "SELF MATCHES %@", "(?:http?s?:\\/\\/)?(?:www.)?(?:m.)?(?:music.)?youtu(?:\\.?be)(?:\\.com)?(?:(?:\\w*.?:\\/\\/)?\\w*.?\\w*-?.?\\w*\\/(?:embed|e|v|watch|.*\\/)?\\??(?:feature=\\w*\\.?\\w*)?&?(?:v=)?\\/?)([\\w\\d_-]{11})(?:\\S+)?").evaluate(with: self)
    }

答案 11 :(得分:0)

从字符串中提取时,这几乎适用于几乎所有的youtube链接:

((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]{10}).\b

答案 12 :(得分:0)

Youtube视频URL更改为iframe支持的链接:

正则表达式:https://regex101.com/r/LeZ9WH/2/

try:
    r = requests...

except requests.exceptions.RequestException as e:
    print (e)

Php功能示例:

http://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://youtu.be/n17B_uFF4cA
http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4
http://www.youtube.com/watch?v=t-ZRX8984sc
http://youtu.be/t-ZRX8984sc
https://youtu.be/2sFlFPmUfNo?t=1

答案 13 :(得分:0)

(?:http?s?:\/\/)?(?:www.)?(?:m.)?(?:music.)?youtu(?:\.?be)(?:\.com)?(?:(?:\w*.?:\/\/)?\w*.?\w*-?.?\w*\/(?:embed|e|v|watch|.*\/)?\??(?:feature=\w*\.?\w*)?&?(?:v=)?\/?)([\w\d_-]{11})(?:\S+)?

https://regex101.com/r/nJzgG0/3

以任何字符串检测YouTube和YouTube音乐链接

答案 14 :(得分:0)

这是我在Scala中使用的答案。从YouTube的网址中提取11位数字非常有用。

  

“ https?://://(?:[0-9a-zA-Z-] +。)?(?:www.youtube.com/ | youtu.be \ S * [^ \ w- \ s] )([\ w-] {11})(?= [^ \ w-] | $)(?![?=&+%\ w] (?:[\'“] [^ <> ] > |))[?=&+%\ w-] *“

def getVideoLinkWR: UserDefinedFunction = udf(f = (videoLink: String) => {
    val youtubeRgx = """https?://(?:[0-9a-zA-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w \-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>|</a>))[?=&+%\w-./]*""".r
    videoLink match {
        case youtubeRgx(a) => s"$a".toString
        case _ => videoLink.toString
    }
}

答案 15 :(得分:0)

此正则表达式解决了我的问题,我可以通过观看,嵌入或共享链接获取youtube链接

(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)

您可以在此处查看https://regex101.com/r/Kvk0nB/1

答案 16 :(得分:0)

这里是获取java或android的youtube视频ID的完整解决方案,我没有找到任何不能使用此功能的链接

public static String getValidYoutubeVideoId(String youtubeUrl)
{
    if(youtubeUrl == null || youtubeUrl.trim().contentEquals(""))
    {
        return "";
    }
    youtubeUrl = youtubeUrl.trim();
    String validYoutubeVideoId = "";
    String regexPattern = "^(?:https?:\\/\\/)?(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*";
    Pattern regexCompiled = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE);
    Matcher regexMatcher = regexCompiled.matcher(youtubeUrl);
    if(regexMatcher.find())
    {
        try
        {
            validYoutubeVideoId = regexMatcher.group(1);
        }
        catch(Exception ex)
        {
        }
    }
    return validYoutubeVideoId;
}

答案 17 :(得分:0)

这是对现有答案的迭代,更好地处理边缘情况。 (例如http://thisisnotyoutu.be/thing

/(?:https?:\/\/|www\.|m\.|^)youtu(?:be\.com\/watch\?(?:.*?&(?:amp;)?)?v=|\.be\/)([\w‌​\-]+)(?:&(?:amp;)?[\w\?=]*)?/

答案 18 :(得分:0)

我正在使用这种链接:

http://www.youtube.com/v/M-faNJWc9T0?fs=1&rel=0

这是我用来从中获取ID的regEx:

"(.+?)(\/v/)([a-zA-Z0-9_-]{11})+"