如何获取 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的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID