如何获取 YouTube 字符串的视频 ID

Posted

技术标签:

【中文标题】如何获取 YouTube 字符串的视频 ID【英文标题】:How to get the video ID of a YouTube string 【发布时间】:2015-05-26 22:13:38 【问题描述】:

(XCode 6.3.2,Swift 1.2) 在研究了整个晚上的互联网之后,我已经知道这不是那么容易做到的。 我只是想获取 YouTube 链接的视频 ID。所以“https://www.youtube.com/watch?v=ABCDE”中的“ABCDE”

到目前为止我得到了什么:

var url = "https://www.youtube.com/watch?v=ABCDE"
let characterToFind: Character = "="
let characterIndex = find(url, characterToFind)
println(characterIndex)
url.substringFromIndex(advance(url.startIndex, characterIndex))

Prinln 输出:可选(31) 没错,但我不能使用它,因为它没有索引。

XCode 还为最后一行声明:在调用中缺少参数 #3 的参数 我也不知道substringFromIndex的第三个参数应该是什么。

非常感谢!

【问题讨论】:

使用componentsSeparatedByString。见***.com/a/29421928/2631081 【参考方案1】:

在您的情况下,无需像其他答案那样创建 NSURL。只需使用:

var url = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = url.componentsSeparatedByString("=").last 
    print(videoID)

【讨论】:

【参考方案2】:

Swift 3+ 版本:

var url = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = url.components(separatedBy: "=").last 
    print(videoID)

【讨论】:

【参考方案3】:

您可以按如下方式使用 NSURL 查询属性:

Xcode 8.3.1 • Swift 3.1

let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = URL(string: link)?.query?.components(separatedBy: "=").last 
    print(videoID) // "ABCDE"

另一种选择是使用 URLComponents

let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = URLComponents(string: link)?.queryItems?.filter($0.name == "v").first?.value 
    print(videoID) // "ABCDE"


Swift 1.x

let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = NSURL(string: link)?.query?.componentsSeparatedByString("=").last 
    println(videoID) // "ABCDE"

【讨论】:

【参考方案4】:

你需要解包可选的才能使用索引:

var url = "https://www.youtube.com/watch?v=ABCDE"
let characterToFind: Character = "="
if let index = find(url, characterToFind)  // Unwrap the optional
  url.substringFromIndex(advance(index, 1)) // => "ABCDE"

【讨论】:

【参考方案5】:

find 返回一个可选字符——因为可能找不到该字符,在这种情况下它将是nil。你需要打开它来检查它不是并得到实际值。

您也可以直接在索引上使用基于范围的subscript,而不是使用advance 将其转换为整数索引:

let url = "https://www.youtube.com/watch?v=ABCDE"
if let let characterIndex = find(url, "=") 
    let value = url[characterIndex.successor()..<url.endIndex]  // ABCDE

else 
    // error handling, if you want it, here

如果在“未找到”的情况下有一个合理的默认值,你有更多的选择例如,如果你在这种情况下只想要一个空字符串,这将起作用:

let idx = find(url, "=")?.successor() ?? url.endIndex
let value = url[idx..<url.endIndex]

或者,也许您现在甚至不需要处理可选性,因此您也很乐意将结果保留为可选:

// value will be Optional("ABCD")
let value = find(url, "=").map  url[$0.successor()..<url.endIndex] 

有关选项的简要说明,请查看 here 和 here。

此外,您可能会发现here 信息很有用,而不是手动解析 URL 字符串。

【讨论】:

【参考方案6】:

使用您的 url 格式,您可以通过转换为 NSURL 来获取 'v' 参数的值,然后获取参数并用 '=' 分隔。

var url: NSURL = NSURL(string: "https://www.youtube.com/watch?v=RAzOOfVA2_8")!
url.query?.componentsSeparatedByString("=").last

url.query 返回v=RAzOOfVA2_8

如果链接有多个参数,你可以获取所有参数然后循环验证每个参数:

var url: NSURL = NSURL(string: "https://www.youtube.com/watch?v=RAzOOfVA2_8")!
var params = url.query?.componentsSeparatedByString("&")
if let _params = params  //have parameters in URL
    for param in _params  //verify each pair of key & value in your parameters
        var _paramArray = param.componentsSeparatedByString("=") //separate by '=' to get key & value
        if (_paramArray.first?.compare("v", options: nil, range: nil, locale: nil) == NSComparisonResult.OrderedSame) 
            println(_paramArray.last)
        
    
 else 
    //url does not have any parameter

【讨论】:

以上是关于如何获取 YouTube 字符串的视频 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何从 url 获取 youtube 视频 ID

如何从 URL 获取 YouTube 视频 ID?

如何从频道 ID 获取 YouTube 视频 URL

如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID

使用 YouTube API,如何从频道名称中获取直播的视频 ID?

如何通过点击webview中的YouTube搜索页面链接获取视频ID