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

时间:2015-05-26 22:13:39

标签: swift indexing character substring

(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的第三个参数是什么。

非常感谢提前!

5 个答案:

答案 0 :(得分:4)

您可以使用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"
}

答案 1 :(得分:4)

Swift 3+版本:

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

答案 2 :(得分:0)

您需要打开可选项才能使用索引:

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

答案 3 :(得分:0)

使用您的网址格式,您可以获得' v'通过转换为NSURL然后获取参数并通过' ='将参数值分开。

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
}

答案 4 :(得分:0)

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

有关期权的详细说明,请查看herehere

此外,您可能会发现信息here非常有用,而不是手工解析网址字符串。