2016-04-09 3 views
1

J'essaie d'extraire l'identifiant vidéo YouTube à partir d'une URL en utilisant l'expression régulière de . Cependant, je n'arrive pas à comprendre comment le formater correctement pour fonctionner avec NSRegularExpression. J'ai essayé d'échapper les barres obliques inverses pour C, ainsi que d'utiliser escapedTemplateForString et escapedPatternForString. J'ai également essayé d'ajouter un antislash avant les parenthèses d'ouverture/fermeture. Chaque cas renvoie NSNotFound pour toutes les URL que j'essaie.Comment utiliser cette expression rationnelle avec NSRegularExpression?

// Original: /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/ 
NSString *c_escaped = @"/^.*(youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*/"; 
NSString *template = [NSRegularExpression escapedTemplateForString:c_escaped]; // "/^.*(youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*/" 
NSString *pattern = [NSRegularExpression escapedPatternForString:c_escaped]; // "\/\^\.\*\(youtu\.be\\\/\|v\\\/\|e\\\/\|u\\\/\\w\+\\\/\|embed\\\/\|v=\)\(\[\^#\\&\\\?]\*\)\.\*\/" 

NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:c_escaped 
                     options:0 
                     error:&error]; 
NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)]; 

NSRegularExpression *expr1 = [NSRegularExpression regularExpressionWithPattern:template 
                     options:0 
                     error:&error]; 
NSRange range1 = [expr1 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)]; 

NSRegularExpression *expr2 = [NSRegularExpression regularExpressionWithPattern:pattern 
                     options:0 
                     error:&error]; 
NSRange range2 = [expr2 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)]; 

Ce sont les URL que j'ai testé contre:

NSArray *urls = @[ 
        @"//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0", 
        @"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo", 
        @"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel", 
        @"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub", 
        @"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I", 
        @"http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY", 
        @"http://youtu.be/6dwqZw0j_jY", 
        @"http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be", 
        @"http://youtu.be/afa-5HQHiAs", 
        @"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0", 
        @"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel", 
        @"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub", 
        @"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I", 
        @"http://www.youtube.com/embed/nas1rJpm7wY?rel=0", 
        @"http://www.youtube.com/watch?v=peFZbP64dsU", 
        @"http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player", 
        @"http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player", 
        @"http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player", 
        @"http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player", 
        @"http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player", 
        @"http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player", 
        @"http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player", 
        @"http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player"]; 

Répondre

1

Vous devez supprimer les barres obliques avant et arrière. Le problème est que vous l'adaptez à JavaScript, ce qui permet d'utiliser "/" pour délimiter les chaînes. Vous devez également échapper aux barres obliques inverses pour que le compilateur Obj-C fasse la bonne chose, mais c'est tout. Essayez ceci:

@implementation NSString (youtube) 

- (BOOL)isYouTubeURL 
{ 
    NSString *youtubePattern = @"^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?]*).*"; 

    NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:youtubePattern 
                      options:0 
                      error:nil]; 
    NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)]; 
    return range.location != NSNotFound; 
} 

@end