2017-09-17 9 views
0

J'ai trouvé deux regex javascript utiles mais aucune d'elles ne semble fonctionner correctement sur Swift.REGEX pour obtenir Vimeo & Dailymotion ID

Cela fonctionne avec une URL Youtube, mais pas avec Vimeo et DailyMotion. Les deux Vimeo & Dailymotion regex fonctionne sur javascript.

Merci les gars.

** EDIT AVEC LA SOLUTION **

Merci GreatBigBore et Larme

private func getVendorId(_ regexStr:String, _ videoUrl:String, _ search:[Int]) -> String { 

    let regex = try? NSRegularExpression(pattern: regexStr, options: .caseInsensitive) 
    let result:[NSTextCheckingResult] = (regex?.matches(in: videoUrl, options: [], range: NSRange(location: 0, length: (videoUrl.characters.count))))! 

    if result.count > 0 { 
     let groups = result.first!; 
     for i in search { 
      if (groups.rangeAt(i).length != 0) { 
       return (videoUrl as NSString).substring(with: groups.rangeAt(i)) 
      } 
     } 
    } 

    return ""; 
} 

override func viewDidLoad() { 

    let youtubeUrl = "https://www.youtube.com/watch?v=MCc0V5bgEF8"; 
    let youtubeRegex = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)"; 
    let youtubeId = getVendorId(youtubeRegex, youtubeUrl, [0]); 
    print("YOUTUBE ID -> \(youtubeId)") 

    let vimeoUrl = "https://player.vimeo.com/video/233459603"; 
    let vimeoRegex = "https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)"; 
    let vimeoId  = getVendorId(vimeoRegex, vimeoUrl, [2]); 
    print("VIMEO ID -> \(vimeoId)") 

    let dailyMotionUrl = "http://www.dailymotion.com/hub/x9q_Galatasaray"; 
    let dailyMotionRegex = "^.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?"; 
    let dailyMotionId = getVendorId(dailyMotionRegex, dailyMotionUrl, [4, 2]); 
    print("DAILYMOTION ID -> \(dailyMotionId)") 


    super.viewDidLoad() 

} 
+0

Ce code ne compile pas. Je voudrais aider, mais vous devez coller le code réel. J'ai changé le second 'regStr' dans votre définition de fonction en' url', mais j'ai remarqué que vous ne faites rien avec ce paramètre. Essayez de coller le code réel. – GreatBigBore

+0

J'ai modifié le code, merci! – noisedan

+0

'let regRes: [Any]' si vous écrivez 'let regRes: [NSTextCheckingResult]' à la place, vous pouvez éviter le 'as? NSTextCheckingResult' dans 'regRes.first as? NSTextCheckingResult'. Pour le reste, as-tu vérifié toutes les valeurs de 'regRes' au lieu de seulement en premier? Qu'est-ce qu'ils impriment? Puisque vous avez plusieurs groupes regex, il peut être intéressant de trouver celui qui est utile pour chaque regex. – Larme

Répondre

0

Vos regexes fonctionnent très bien. Le problème est que vous ne comptabilisez pas plusieurs groupes de capture. Votre variable result contiendra un NSRange pour chaque groupe de capture; vous devez obtenir votre ID capturé à partir de l'un de ceux-ci, pas à partir de result?.range. Voici un exemple de code pour vous montrer ce que je veux dire. Ajoutez à votre fonction getId(), après let result:

print("Capture group count", result!.numberOfRanges) 

for i in 0 ..< result!.numberOfRanges { 
    if result!.range(at: i).length == 0 { 
     print("Group \(i) is empty") 
    } else { 
     print("Group \(i) captured", (url as NSString).substring(with: result!.range(at: i))) 
    } 
} 

Il est pas clair pour moi pourquoi votre identifiant youtube capturé la façon dont il a fait; Je pense que ça a quelque chose à voir avec tout ce look-behind (je ne suis pas un expert avec look-behind). Mais le problème n'est pas avec votre regex; c'est juste que vous devez obtenir votre identifiant du groupe de capture, pas directement depuis regRes.first.

+0

Merci, a travaillé! Je poste la solution complète. – noisedan