2015-05-26 36 views
4

(XCode 6.3.2,Swift 1.2)
在研究整個傍晚的互聯網之後,我已經知道這不是那麼容易做到的。
我只想獲取YouTube鏈接的視頻ID。因此,「ABCDE」,在「https://www.youtube.com/watch?v=ABCDE如何獲取YouTube字符串的視頻ID

我走到這一步:

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的第三個參數應該是什麼。

非常感謝提前!

+0

使用'componentsSeparatedByString'。請參閱http://stackoverflow.com/a/29421928/2631081 – Blip

回答

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

有你網站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

如果該鏈接已經超過1個參數,你可以得到所有的參數,然後做一個循環,以驗證每一個參數:

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 
} 
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有用,而不是手動解析URL字符串。

4

可以使用NSURL查詢屬性如下:

的Xcode 8.3.1•斯威夫特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" 
} 

斯威夫特1.x的

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

在你的情況下,沒有必要創建作爲其他答案做的NSURL。只需使用:

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

斯威夫特3+版本:

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