2016-12-15 121 views
2

基本上我有一个YouTube网址字符串,我想从URL中提取的视频ID。我发现在Objective C的一些代码,如下图所示:YouTube视频ID从URL - Swift3

NSError *error = NULL; 
NSRegularExpression *regex = 
[NSRegularExpression regularExpressionWithPattern:@"?.*v=([^&]+)" 
              options:NSRegularExpressionCaseInsensitive 
              error:&error]; 
NSTextCheckingResult *match = [regex firstMatchInString:youtubeURL 
               options:0 
                range:NSMakeRange(0, [youtubeURL length])]; 
if (match) { 
    NSRange videoIDRange = [match rangeAtIndex:1]; 
    NSString *substringForFirstMatch = [youtubeURL substringWithRange:videoIDRange]; 
} 

当我将这个代码swift3是:

var error: Error? = nil 
var regex = try! NSRegularExpression(pattern: "?.*v=([^&]+)", options: .caseInsensitive) 
var match = regex!.firstMatch(in: youtubeURL, options: [], range: NSRange(location: 0, length: youtubeURL.length))! 
if match { 
    var videoIDRange = match.rangeAt(1) 
    var substringForFirstMatch = (youtubeURL as NSString).substring(with: videoIDRange) 
} 

给出错误为:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=2048 "The value “?.*v=([^&]+)” is invalid."

人帮我这个错误或任何人解释如何从URL获取视频ID在斯威夫特3.

在此先感谢

回答

5

我做这个使用URLComponents不同的方式。然后您只需从url中选择“v”参数(如果存在)。

func getYoutubeId(youtubeUrl: String) -> String? { 
    return URLComponents(string: youtubeUrl)?.queryItems?.first(where: { $0.name == "v" })?.value 
} 

然后通过在YouTube网址是这样的:

print (getYoutubeId(youtubeUrl: "https://www.youtube.com/watch?v=Y7ojcTR78qE&spfreload=9")) 
+0

单行'return URLComponents(string:youtubeUrl)?. queryItems?.first(其中:{$ 0.name ==“v”})?.值' –

+0

好点。将更新我的例子。 – totiG

+0

谢谢你...... !!! –

1

你的第一个问题是你是不是在你的表达逃逸??是保留字符,如果要在表达式中使用它,则必须使用\进行转义,并且由于\也用于转义"字符,因此必须使用双反斜杠?(如\\?)进行转义。所以根据上面的信息,下面的代码正确地提取VIDEOID

let youtubeURL = "https://www.youtube.com/watch?v=uH8o-JTHJdM" 
let regex = try! NSRegularExpression(pattern: "\\?.*v=([^&]+)", options: .caseInsensitive) 
let match = regex.firstMatch(in: youtubeURL, options: [], range: NSRange(location: 0, length: youtubeURL.characters.count)) 
if let videoIDRange = match?.rangeAt(1) { 
    let substringForFirstMatch = (youtubeURL as NSString).substring(with: videoIDRange) 
} else { 
    //NO video URL 
} 
+0

谢谢....!现在它正在工作 –

0

这里是代码从任何YouTube网址提取YouTube视频ID: (SWIFT)

func extractYoutubeId(fromLink link: String) -> String { 
     let regexString: String = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
     let regExp = try? NSRegularExpression(pattern: regexString, options: .caseInsensitive) 
     let array: [Any] = (regExp?.matches(in: link, options: [], range: NSRange(location: 0, length: (link.characters.count))))! 
     if array.count > 0 { 
      let result: NSTextCheckingResult? = array.first as? NSTextCheckingResult 
      return (link as NSString).substring(with: (result?.range)!) 
     } 

     return "" 
    } 
5

夫特3/4 - 准备和安全版本(无动力展开!):

extension String { 
    var youtubeID: String? { 
     let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 

     let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) 
     let range = NSRange(location: 0, length: count) 

     guard let result = regex?.firstMatch(in: self, options: [], range: range) else { 
      return nil 
     } 

     return (self as NSString).substring(with: result.range) 
    } 
} 

Credits:Usman Nisar's answer