YouTube视频ID从URL - Swift3
基本上我有一个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.
在此先感谢
我做这个使用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"))
你的第一个问题是你是不是在你的表达逃逸?
。 ?
是保留字符,如果要在表达式中使用它,则必须使用\
进行转义,并且由于\
也用于转义"
字符,因此必须使用双反斜杠?
(如\\?
)进行转义。所以根据上面的信息,下面的代码正确地提取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
}
谢谢....!现在它正在工作 –
这里是代码从任何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 ""
}
夫特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
单行'return URLComponents(string:youtubeUrl)?. queryItems?.first(其中:{$ 0.name ==“v”})?.值' –
好点。将更新我的例子。 – totiG
谢谢你...... !!! –