2016-12-15 3 views
2

Fondamentalement, j'ai une URL Youtube en tant que chaîne, je veux extraire l'ID vidéo de cette URL. J'ai trouvé un peu de code dans c objectif qui est comme ci-dessous:Youtube Video Id de l'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]; 
} 

Quand je suis en train de convertir ce code swift3 qui est:

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

Donne erreur:

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

Quelqu'un peut-il aidez-moi à propos de cette erreur ou n'importe qui explique comment obtenir l'ID vidéo de l'URL dans Swift 3.

Merci d'avance

Répondre

5

J'ai une manière différente de faire cela en utilisant URLComponents. Vous sélectionnez simplement le paramètre 'v' de l'URL, s'il existe.

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

Et puis passer dans une URL Youtube comme ceci:

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

seule ligne 'URLComponents de retour (chaîne: youtubeUrl) ?. queryItems .first (où: {0.name $ == "v"})? ?. value' –

+0

Bon point. Mettra à jour mon exemple. – totiG

+0

Remerciements ...... –

1

Votre premier problème est que vous n'êtes pas fuyez ? dans votre expression. ? est un caractère réservé et si vous voulez l'utiliser dans vos expressions, vous devez échapper avec \ et puisque \ est également utilisé pour échapper " caractère vous devez échapper ? avec double barre oblique inverse quelque chose comme \\?. Ainsi, selon les informations ci-dessus, le code suivant extrait correctement le 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

Merci ....! Maintenant ça marche –

0

Voici le code pour extraire id vidéo youtube de toute url youtube: (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

Swift 3/4 - prêt et plus sûr la version (sans la force déballant !):

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

Crédits: Usman Nisar's answer