2016-04-09 21 views
1

Youtube video kimliğini bir URL'den this answer regex kullanarak çıkarmaya çalışıyorum. Ancak, NSRegularExpression ile çalışmak için doğru biçimde nasıl biçimlendirileceğini anlayamıyorum. C için ters eğik çizgi kaçan denedim yanı sıra escapedTemplateForString ve escapedPatternForString kullanarak. Açma/kapama braketlerinden önce bir ters eğik çizgi eklemeyi de denedim. Her durum, denediğim tüm URL'ler için NSNotFound'u döndürür.Bu regex NSRegularExpression ile nasıl kullanılır?

// 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)]; 

Bunlar karşı test ettik URL'ler şunlardır:

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"]; 

cevap

1

Sen baştaki ve sondaki eğik çizgi silmeniz gerekir. Sorun şu ki, bunu ipuçlarını sınırlamak için "/" kullanımına izin veren JavaScript'ten uyarlıyorsunuz. Ayrıca Obj-C derleyicisinin doğru şeyi yapmasını sağlamak için ters eğik çizgi kaçmak gerekir, ama hepsi bu. Bunu deneyin:

@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