2012-07-16 19 views
21

मूल रूप से एक यूट्यूब यूआरएल एनएसएसटींग के रूप में है, लेकिन मुझे यूआरएल में प्रदर्शित वीडियो आईडी निकालने की आवश्यकता है। मुझे php या अन्य वेब-आधारित प्रोग्रामिंग भाषाओं में ऐसा करने के तरीके पर कई ट्यूटोरियल मिले, लेकिन उद्देश्य सी में कोई भी नहीं ...यूआरएल से यूट्यूब वीडियो आईडी - उद्देश्य सी

मैं मूल रूप से एक विधि की तलाश कर रहा हूं जो पैरामीटर के रूप में एक एनएसएसटींग यूआरएल मांगता है और वीडियो आईडी को एक और nsstring के रूप में लौटाता है ...

कोई भी जानता है कि वहां या कोई ट्यूटोरियल कैसे करें?

+0

वहाँ एक अलग प्रारूप आप के साथ काम कर रहे हैं? क्या आप एक उदाहरण दे सकते हैं? – Stavash

+0

@stavash नहीं केवल मूल यूट्यूब डेस्कटॉप यूआरएल ... –

+1

आप एक उदाहरण यूआरएल और आपने जो कोशिश की है उसे आपूर्ति कर सकते हैं। – eternalmatt

उत्तर

15

तो एक यूट्यूब यूआरएल तरह दिखता है:

http://www.youtube.com/watch?v=oHg5SJYRHA0

वीडियो आईडी आप है में रुचि रखते हैं अंत (oHg5SJYRHA0) में हिस्सा है .... हालांकि यह जरूरी अंत में नहीं है , क्योंकि यूट्यूब यूआरएल में क्वेरी स्ट्रिंग में अन्य पैरामीटर हो सकते हैं।

आपकी सर्वश्रेष्ठ शर्त शायद नियमित अभिव्यक्ति और फाउंडेशन की NSRegularExpression कक्षा का उपयोग करने के लिए है। मुझे लगता है कि इस दृष्टिकोण का उपयोग आपके द्वारा प्राप्त अन्य-भाषा ट्यूटोरियल्स में किया जाता है - ध्यान दें कि नियमित अभिव्यक्तियों की सामग्री किसी भी भाषा या टूलकिट में काफी समान होती है जिसमें उन्हें शामिल किया जाता है, इसलिए उन ट्यूटोरियल में पाए गए किसी भी रेगेक्स को काम करना चाहिए तुम्हारे लिए। (मैं v= पर तोड़ने और अपने 11 अक्षरों को लेने के अपने दृष्टिकोण के खिलाफ सलाह दूंगा, क्योंकि यह विफलता के विभिन्न तरीकों से ग्रस्त है, जिसके लिए रेगेक्स अधिक मजबूत है।)

वीडियो आईडी ढूंढने के लिए आप एक रेगेक्स चाहते हैं v=([^&]+) की तरह। v= हमें क्वेरी यूआरएल के दाहिने हिस्से में ले जाता है (अगर हमें watch?fmt=22&v=oHg5SJYRHA0 जैसे कुछ मिलता है)। कोष्ठक कैप्चर समूह बनाते हैं ताकि हम केवल वीडियो आईडी निकाल सकें, न कि अन्य मिलान किए गए वर्ण जिन्हें हम इसे ढूंढने के लिए इस्तेमाल करते थे, और कोष्ठक के अंदर हम एक या अधिक वर्णों का अनुक्रम देखते हैं जो एक एम्पर्सेंड नहीं है - यह सुनिश्चित करता है कि हम v=whatever फ़ील्ड में सबकुछ प्राप्त करें, और इसके बाद कोई फ़ील्ड नहीं है यदि आपको watch?v=oHg5SJYRHA0&rel=0 जैसे यूआरएल मिलते हैं।

चाहे आप इस या अन्य regex का उपयोग करें, यह संभावना है कि आप कैप्चर समूह का उपयोग करेंगे। (यदि नहीं, rangeOfFirstMatchInString:options:range: बस आपको बस इतना ही चाहिए, जैसा कि दीमा के जवाब में देखा गया है।) आप कैप्चर समूहों की सामग्रियों (के रूप में NSTextCheckingResult वस्तुओं) firstMatchInString:options:range: का उपयोग कर या इसी तरह के तरीकों पर प्राप्त कर सकते हैं:

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]; 
} 
+2

एक ओवरकिल का थोड़ा सा regexes ** और ** एक ही समय में इसके लिए पर्याप्त लचीला नहीं है? मुझे यह सब * बहुत भयानक लगता है। * –

+0

मेरे लिए काम नहीं कर रहा है आपको हटा देना चाहिए?आपकी नियमित अभिव्यक्ति से –

8

जो ट्यूटोरियल आप शायद देख रहे हैं वे केवल नियमित अभिव्यक्तियों का उपयोग करने के निर्देश हैं, जो आप इस मामले में भी उपयोग करना चाहते हैं।

कोको कक्षा जिसे आप उपयोग करने की आवश्यकता होगी NSRegularExpression है।

आपकी वास्तविक रेगेक्स स्ट्रिंग उस प्रारूप पर निर्भर करेगी जिस पर आप यूआरएल की अपेक्षा कर रहे हैं क्योंकि ऐसा लगता है कि यूट्यूब में कई हैं। सामान्य समारोह कुछ ऐसी दिखाई देगी तरह:

+ (NSString *)extractYoutubeID:(NSString *)youtubeURL 
{ 
    NSError *error = NULL; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"your regex string goes here" options:NSRegularExpressionCaseInsensitive error:&error]; 
    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:youtubeURL options:0 range:NSMakeRange(0, [youtubeURL length])]; 
    if(!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) 
    { 
    NSString *substringForFirstMatch = [youtubeURL substringWithRange:rangeOfFirstMatch]; 

    return substringForFirstMatch; 
    } 
    return nil; 
} 
+1

आपको 'शून्य' नहीं 'एनयूएलएल' का उपयोग करना चाहिए। http://stackoverflow.com/a/1564419/11976 –

+0

अपडेट किया गया क्योंकि मैं सहमत हूं, लेकिन सामान्य रूप से इससे कोई फर्क नहीं पड़ता। – Dima

-3

मैं इसे अपने आप से पता लगा ...

NSArray *videoURLSplit = [videoURL componentsSeparatedByString:@"v="]; 
NSString *videoID = [[videoURLSplit objectAtIndex:1] substringToIndex:11]; 
NSLog(@"%@",videoID); 

बहुत ही सरल ... सभी वीडियो यूआरएल वी = VIDEO_ID शामिल मैं सिर्फ एक में यूआरएल अलग सरणी और उसके बाद v = के बाद के पहले 11 अंक प्राप्त हुए हैं क्योंकि यूआरएल में अधिक http GET जानकारी हो सकती है ...

हालांकि मदद करने के लिए धन्यवाद!

+1

इसके साथ सावधान रहें क्योंकि यह वास्तव में सच नहीं है। ऐसे कई प्रारूप हैं जिनमें वीडियो आ सकते हैं जैसे http: //youtu.be/########### 'और 'youtube.com/v/######### ## '। – Dima

+1

और क्या होता है जब यूट्यूब 11 अक्षरों से अधिक आईडी का उपयोग शुरू करता है। आपको इसे भी विचार करने की आवश्यकता है। – eternalmatt

+0

@Dima इसके लिए धन्यवाद, लेकिन मैं http://www.youtube.com/watch?nomobile=1 को एक वेबव्यू में यह विशिष्ट पता लोड करता हूं और मैं केवल उपयोगकर्ता को वीडियो खोजने की अनुमति देता हूं और उन पर क्लिक करता हूं ताकि बस हर बार यूआरएल होना चाहिए ... http://www.youtube.com/v=VIDEO_ID –

38

खेद है - मैं चुना जवाब देने के लिए एक टिप्पणी जोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है।

रेगेक्स के लिए सही वाक्यविन्यास खोजने की कोशिश करने वाले युगों को खर्च करने के बाद, मैं इस पर आ गया हूं जिसने मेरी मदद की है। उम्मीद है कि यह किसी और की मदद कर सकता है!

NSString *regexString = @"(?<=v(=|/))([-a-zA-Z0-9_]+)|(?<=youtu.be/)([-a-zA-Z0-9_]+)"; 

here से लिया गया। यह निम्न URL प्रारूपों के लिए काम करता है:

+3

यह मेरे लिए काम करता है, बस यह उल्लेख करने के लिए कि आप इसे प्राप्त करने के लिए श्रेणी संख्या 0 तक पहुंचने के लिए तैयार हैं: NSRange वीडियोIDRange = [match rangeAtIndex: 0]; एनएसएसटींग * वीडियोआईडी = [संदेश सबस्ट्रिंग विथेंज: वीडियो आईडीआरेंज]; –

+1

दा को सबसे अच्छा जवाब evaaa हो! यदि यह डेटा दीमा होमी के उत्तर – GangstaGraham

1

यहाँ मेरी समाधान जो r है StackOveFlow से संदर्भित। (Youtube I.D parsing for new URL formats)

मैंने कुछ संशोधन किया।

/// यह ज

#import <Foundation/Foundation.h> 
@interface YoutubeParser : NSObject 

+(BOOL) isValidateYoutubeURL:(NSString *)youtubeURL; 

+(NSArray *) parseHTML:(NSString *)html ; 

@end 

///This is the .m 
#import "YoutubeParser.h" 

@interface YoutubeParser() { 
} 

@end 

@implementation YoutubeParser 

#define YOUTUBE_PATTERN @"(https?://)?(www\\.)?(youtu\\.be/|youtube\\.com)?(/|/embed/|/v/|/watch\\?v=|/watch\\?.+&v=)([\\w_-]{11})(&.+)?" 

+(NSRegularExpression *)regex { 

    static NSRegularExpression * regex = nil; 

    regex =  [NSRegularExpression regularExpressionWithPattern:YOUTUBE_PATTERN 
                   options:NSRegularExpressionCaseInsensitive 
                   error:nil]; 
    return regex; 
} 

+(BOOL) isValidateYoutubeURL:(NSString *)youtubeURL { 
    NSInteger cnt = [[YoutubeParser regex] numberOfMatchesInString:youtubeURL options:0 range:NSMakeRange(0, [youtubeURL length]) ]; 

    return cnt > 0 ? YES : NO; 
} 

typedef void (^matching_block_t) (NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop); 

+(NSArray *) parseHTML:(NSString *)html { 
    NSMutableArray * youtubeURLArray = [[NSMutableArray alloc] init]; 

    matching_block_t parseTask = ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
     NSRange matchRange = [result range]; 
     NSRange youtubeKey = [result rangeAtIndex:5]; //the youtube key 
     NSString * strKey = [html substringWithRange:youtubeKey] ; 
     NSLog(@"youtubeKey=%@ , with url=%@ " ,strKey , [html substringWithRange:matchRange]); 

     [youtubeURLArray addObject:strKey]; 
    }; 

    [[YoutubeParser regex] enumerateMatchesInString:html options:0 range:NSMakeRange(0, [html length]) usingBlock:parseTask ]; 

    return youtubeURLArray; 
} 

@end 
7

तुम भी regexes की आवश्यकता नहीं है। निम्नलिखित काम करता है URL में वीडियो आईडी की लंबाई और अपनी स्थिति की परवाह किए बिना:

NSString *vID = nil; 
NSString *url = @"http://www.youtube.com/watch?v=cAcqdjLCN7s"; 

NSString *query = [url componentsSeparatedByString:@"?"][1]; 
NSArray *pairs = [query componentsSeparatedByString:@"&"]; 
for (NSString *pair in pairs) { 
    NSArray *kv = [pair componentsSeparatedByString:@"="]; 
    if ([kv[0] isEqualToString:@"v"]) { 
     vID = kv[1]; 
     break; 
    } 
} 

NSLog(@"%@", vID); 
+0

नियमित अभिव्यक्तियों से काफी अच्छा था। अभी भी [यह] नहीं लेता है (http://stackoverflow.com/questions/11509164/youtube-video-id-from-url-objective-c/17798344#comment15209148_11509927) जैसे यूट्यूब-डीएल करता है, लेकिन ओह ठीक है । ;) – Ryan

+0

@minitech मेरा सिद्धांत: यदि हम छोटी गाड़ी हैक विकसित कर रहे हैं, तो हमें कम से कम सुरुचिपूर्ण होना चाहिए: पी धन्यवाद। (वैसे: यदि मैं आपके बिंदु को सही ढंग से समझता हूं, तो मेरी त्रुटि आसानी से '? #' वर्ण सेट में वर्णों द्वारा यूआरएल को अलग करके सुलभ कर सकती है ...) –

+0

+1: यह केवल मेरे साथ काम करता है ... –

2
- (NSString*)getYoutubeVideoID:(NSString*)url { 
    NSError *error = NULL; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=watch\\?v=|/videos/|embed\\/)[^#\\&\\?]*" 
               options:NSRegularExpressionCaseInsensitive 
               error:&error]; 

    NSTextCheckingResult *match = [regex firstMatchInString:url 
                options:0 
                 range:NSMakeRange(0, [url length])]; 
    NSString *substringForFirstMatch; 
    if (match) { 
     NSRange videoIDRange = [match rangeAtIndex:0]; 
     substringForFirstMatch = [url substringWithRange:videoIDRange]; 
    } 
    return substringForFirstMatch; 
} 
2

मैं उच्चतम एक बेहतर, अधिक प्रतिबंधात्मक regex लिखने के लिए इस सवाल का जवाब मतदान हुआ करता था।

NSString *regex = @"(?:youtube.com.+v[=/]|youtu.be/)([-a-zA-Z0-9_]+)"; 

और फिर आप आईडी

NSTextCheckingResult *match = [regex firstMatchInString:url 
               options:0 
                range:NSMakeRange(0, [url length])]; 
NSRange videoIDRange = [match rangeAtIndex:1]; 
NSString *youTubeID = [url substringWithRange:videoIDRange]; 
62

यहाँ प्राप्त कर सकते है RegExp यह इन मामलों

उद्देश्य सी

- (NSString *)extractYoutubeIdFromLink:(NSString *)link { 
    NSString *regexString = @"((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)"; 
    NSRegularExpression *regExp = [NSRegularExpression regularExpressionWithPattern:regexString 
                      options:NSRegularExpressionCaseInsensitive 
                       error:nil]; 

    NSArray *array = [regExp matchesInString:link options:0 range:NSMakeRange(0,link.length)]; 
    if (array.count > 0) { 
     NSTextCheckingResult *result = array.firstObject; 
     return [link substringWithRange:result.range]; 
    } 
    return nil; 
} 

स्विफ्ट को कवर

func extractYoutubeIdFromLink(link: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    guard let regExp = try? NSRegularExpression(pattern: pattern, options: .CaseInsensitive) else { 
     return nil 
    } 
    let nsLink = link as NSString 
    let options = NSMatchingOptions(rawValue: 0) 
    let range = NSRange(location: 0,length: nsLink.length) 
    let matches = regExp.matchesInString(link as String, options:options, range:range) 
    if let firstMatch = matches.first { 
     return nsLink.substringWithRange(firstMatch.range) 
    } 
    return nil 
} 

स्विफ्ट 3

func extractYoutubeIdFromLink(link: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    guard let regExp = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) else { 
     return nil 
    } 
    let nsLink = link as NSString 
    let options = NSRegularExpression.MatchingOptions(rawValue: 0) 
    let range = NSRange(location: 0, length: nsLink.length) 
    let matches = regExp.matches(in: link as String, options:options, range:range) 
    if let firstMatch = matches.first { 
     return nsLink.substring(with: firstMatch.range) 
    } 
    return nil 
} 
+0

यह काम करता है मेरे लिए, धन्यवाद! –

+1

@ZianChen, आपका स्वागत है – Alex

+0

आप उन विधियों को स्थिर क्यों नहीं बनाते? स्वयं का उपयोग करने की ज़रूरत नहीं है ... –

3

इस उत्तर के आधार पर: PHP Regex to get youtube video ID?

मैं ग/ObjC/C++ स्ट्रिंग के लिए एक regex अनुकूलित, यहां महत्वपूर्ण बात यह है कि regex फेसबुक से वीडियो नहीं मिलता है या अन्य सेवाएं।ICU

NSString *regexString = @"^(?:http(?:s)?://)?(?:www\\.)?(?:m\\.)?(?:youtu\\.be/|youtube\\.com/(?:(?:watch)?\\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)/))([^\?&\"'>]+)"; 

NSError *error; 
NSRegularExpression *regex = 
[NSRegularExpression regularExpressionWithPattern:regexString 
              options:NSRegularExpressionCaseInsensitive 
              error:&error]; 
NSTextCheckingResult *match = [regex firstMatchInString:message 
               options:0 
                range:NSMakeRange(0, [message length])]; 

if (match && match.numberOfRanges == 2) { 
    NSRange videoIDRange = [match rangeAtIndex:1]; 
    NSString *videoID = [message substringWithRange:videoIDRange]; 

    return videoID; 
} 

से मेल खाता है: आईओएस regex पर आधारित है

से मेल नहीं खाता:

0

यहाँ @ jt_ik के regex का उपयोग कर तेजी से संस्करण है:

func extractYoutubeID(youtubeURL: String) -> String { 
    var error: NSError? 
    let pattern: String = "(?<=v(=|/))([-a-zA-Z0-9_]+)|(?<=youtu.be/)([-a-zA-Z0-9_]+)" 
    let regex = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)! 

    if error == nil { 
     if let regexMatch = regex.firstMatchInString(youtubeURL, options: nil, range: NSRange(location: 0, length: youtubeURL.utf16Count)) { 
      return (youtubeURL as NSString).substringWithRange(regexMatch.range) 
     } 
     // Handle no match here 
     return "" 
    } else { 
     // Handle error here 
     println(error?.userInfo) 
     return "" 
    } 
} 
+0

यह "vi" युक्त लिंक के साथ काम नहीं करता है। –

1

यहां बहुत सारे अच्छे उत्तर हैं लेकिन मैंने सोचा कि यह बी हो सकता है कुछ स्ट्रिंग से कई वीडियो_आईडी को पार्स करने के लिए कुछ फायदेमंद हैं। यह एक वेब पेज या विभिन्न यूआरएल की एक सरणी हो सकती है।पृष्ठ सामग्री के

उदाहरण

NSString *content = @"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo,http://youtu.be/NLqAF9hrVbY,http://www.youtube.com/watch?v=NLqAF9hrVbY,http://facebook.com,http://www.youtube.com/watch?v=cAcqdjLCN7s"; 

विधि

-(NSArray *)extractVideos:(NSString *)content { 
    NSString *extractRegex = @"(?<=v(=|/))([-a-zA-Z0-9_]+)|(?<=youtu.be/)([-a-zA-Z0-9_]+)" 
    NSMutableArray *extractedContent = [[NSMutableArray alloc] init]; 
    if ([content hasPrefix:@"http://"] || [content hasPrefix:@"https://"]) { 
     NSURL *extractURL = [NSURL URLWithString:content]; 
     if ([extractURL.host rangeOfString:@"youtu"].location != NSNotFound) { 
      NSRegularExpression *extractRegex = [NSRegularExpression regularExpressionWithPattern:extractRegex options:NSRegularExpressionCaseInsensitive error:nil]; 
      NSArray *extractResults = [extractRegex matchesInString:content options:0 range:NSMakeRange(0, content.length)]; 
      for (NSTextCheckingResult *match in extractResults) { 
       [extractedContent addObject:[content substringWithRange:match.range]]; 

      } 

     } 

    } 

    return extractedContent; 

} 

आउटपुट

( 
    NLqAF9hrVbY, 
    QLqAF9eeVbY, 
    cAcqdjLCN7s 
) 

क्रेडिट Regex

+0

विस्तृत उत्तर के लिए धन्यवाद, लेकिन मैं यह समझने में सक्षम नहीं हूं कि YT_ID_EXTRACT_REGEX – Rimon

+0

क्या है, इसे समझें, इसे समझें। जो लोग सोच रहे थे, उनके लिए बस '# परिभाषित करें YT_ID_EXTRACT_REGEX @" (? <= V (= | /)) ([- a-zA-Z0-9 _] +) | (? <= Youtu.be/) ([-a-zA-Z0-9 _] +) "इस लाइन के बजाय आपकी फ़ाइल के शीर्ष पर 'NSString * extractRegex = @" (? <= v (= | /)) ([- a-zA- Z0-9 _] +) | (? <= Youtu.be/)([-a-zA-Z0-9_]+) " – Rimon

+0

@RimonRagaie कोड में त्रुटि के लिए खेद है, मैंने इसे अभी बदल दिया है लेकिन बहुत देर हो चुकी है। आशा है कि बाकी के जवाब में मदद मिलेगी। –

1

के लिए @Alex को अपने कुछ उत्तर विलय, मैं डी कहो यह बीएस है टी जवाब: @Alex जवाब @Alex जवाब के लिए

func getYoutubeVideoId(youtubeLink:String) -> String?{ 
    var youtubeId:String? = nil 
    let pattern: String = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    do { 
     let regex = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive) 
     if let regexMatch = regex.firstMatchInString(youtubeLink, options: NSMatchingOptions(rawValue: 0), range: NSRange(location: 0, length: youtubeLink.characters.count)) { 
      youtubeId = (youtubeLink as NSString).substringWithRange(regexMatch.range) 
     } 
    } 
    catch let error as NSError{ 
     print("Error while extracting youtube id \(error.debugDescription)") 
    } 

    return youtubeId 
} 
1

स्विफ्ट 2 संस्करण

func extractYoutubeIdFromLink(link: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    guard let regExp = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) else { 
     return nil 
    } 
    let nsLink = link as NSString 
    let options = NSRegularExpression.MatchingOptions(rawValue: 0) 
    let range = NSRange(location: 0,length: nsLink.length) 
    let matches = regExp.matches(in: link as String, options:options, range:range) 
    if let firstMatch = matches.first { 
     debugPrint(firstMatch) 
     return nsLink.substring(with: firstMatch.range) 
    } 
    return nil 
} 
0

स्विफ्ट 3 संस्करण के लिए

+ (NSString *)extractYoutubeID:(NSString *)youtubeURL 
{ 
    NSError *error = NULL; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=v(=|/))([-a-zA-Z0-9_]+)|(?<=youtu.be/)([-a-zA-Z0-9_]+)" 
                      options:NSRegularExpressionCaseInsensitive 
                      error:&error]; 
    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:youtubeURL options:NSMatchingReportProgress range:NSMakeRange(0, [youtubeURL length])]; 
    if(rangeOfFirstMatch.location != NSNotFound) { 
     NSString *substringForFirstMatch = [youtubeURL substringWithRange:rangeOfFirstMatch]; 

     return substringForFirstMatch; 
    } 

    return nil; 
} 
1

अद्यतन स्विफ्ट 4:

static func extractYoutubeVideoId(from url: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    guard let range = url.range(of: pattern, options: .regularExpression) else { return nil } 
    return String(url[range]) 
} 

पुराना जवाब: की
थोड़ा तेज रास्ता @ एलेक्स के स्विफ्ट 3 जवाब w/ओ NSString के उपयोग:
हम regex का प्रयास करें, क्योंकि हम जानते हैं कि यह मान्य है मजबूर कर सकते हैं।

static func extractYoutubeVideoId(from url: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    let regex = try! NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) 
    let range = NSRange(location: 0, length: url.utf16.count) 
    guard let firstMatch = regex.firstMatch(in: url, options: .init(rawValue: 0), range: range) else { return nil } 
    let start = String.UTF16Index(firstMatch.range.location) 
    let end = String.UTF16Index(firstMatch.range.location + firstMatch.range.length) 
    return String(url.utf16[start..<end]) 
} 

या, यदि आप अभी भी चाहते हैं NSString:

static func extractYoutubeVideoId(from url: String) -> String? { 
    let pattern = "((?<=(v|V)/)|(?<=be/)|(?<=(\\?|\\&)v=)|(?<=embed/))([\\w-]++)" 
    let regex = try! NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) 
    let range = NSRange(location: 0, length: (url as NSString).length) 
    guard let firstMatch = regex.firstMatch(in: url, options: .init(rawValue: 0), range: range) else { return nil } 
    return (url as NSString).substring(with: firstMatch.range) 
} 
संबंधित मुद्दे