Youtube ID видео с URL – цель C

У меня в основном есть Youtube-url как NSString, но мне нужно извлечь идентификатор видео, отображаемый в URL-адресе. Я нашел много руководств о том, как это сделать на php или других языках программирования на веб-сайте, но ни один из них не …

Я в основном ищу метод, который запрашивает URL-адрес NSString в качестве параметра и возвращает идентификатор видео в качестве другой nsstring …

Кто-нибудь знает, как это сделать или какие-то учебники?

16 Solutions collect form web for “Youtube ID видео с URL – цель C”

Таким образом, URL-адрес YouTube выглядит примерно так:

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

Идентификатор видео, который вас интересует, – это часть в конце ( oHg5SJYRHA0 ) …. хотя это не обязательно в конце, так как URL-адреса YouTube могут содержать другие параметры в строке запроса.

Лучше всего использовать регулярное выражение и класс NSRegularExpression Foundation. Я предполагаю, что этот подход используется в других учебниках, которые вы нашли, – обратите внимание, что содержание регулярных выражений практически одинаково на любом языке или наборе инструментов, который включает их, поэтому любое регулярное выражение, найденное в этих учебниках, должно работать для тебя. (Я бы посоветовал против вашего подхода взломать v= и взять ровно 11 символов, поскольку это подвержено различным режимам отказа, к которым регулярное выражение более надежное.)

Чтобы найти идентификатор видео, вам может понадобиться регулярное выражение, например v=([^&]+) . v= возвращает нас в нужную часть URL-адреса запроса (если мы получим что-то вроде watch?fmt=22&v=oHg5SJYRHA0 ). Скобки создают группу захвата, поэтому мы можем извлекать только идентификатор видео, а не другие совпадающие символы, которые мы использовали для его поиска, а внутри круглых скобок мы ищем последовательность из одного или нескольких символов, которые не являются амперсандами – это гарантирует мы получаем все в поле v=whatever поле, и после него нет полей, если вы получите URL-адрес, например, watch?v=oHg5SJYRHA0&rel=0 .

Используете ли вы это или другое регулярное выражение, вероятно, вы будете использовать группы захвата. (Если нет, 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]; } 

Здесь RegExp он охватывает эти случаи

Цель C

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

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

Извините – у меня недостаточно комментариев, чтобы добавить комментарий к выбранному ответу.

Проведя возраст, пытаясь найти правильный синтаксис для регулярного выражения, я столкнулся с этим, что помогло мне. Надеюсь, это может помочь кому-то еще!

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

Взято отсюда . Это работает для следующих форматов URL:

Учебники, которые вы, вероятно, видите, – это просто инструкции по использованию регулярных выражений, которые также вы хотите использовать в этом случае.

Класс Cocoa, который вам нужно использовать, – это NSRegularExpression .

Ваша фактическая строка регулярного выражения будет зависеть от формата, который вы ожидаете от URL-адреса, поскольку он похож на то, что у youtube есть несколько. Общая функция будет выглядеть примерно так:

 + (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; } 

Вам даже не нужны регулярные выражения. Следующие действия выполняются независимо от длины идентификатора видео и его позиции в 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); 

На основе этого ответа: PHP Regex, чтобы получить ID видео YouTube?

Я адаптировал регулярное выражение для строки c / objc / c ++, важная часть здесь заключается в том, что регулярное выражение не получает видеоролики из facebook или других сервисов. Регулятор iOS основан на: 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; } 

Матчи:

Не совпадает:

 - (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; } 

Я использовал самый высокий голосовой ответ, чтобы написать лучшее, более ограничительное регулярное выражение.

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

Вот мое решение, которое ссылается на StackOveFlow. ( Синтаксический анализ идентификатора Youtube для новых форматов URL )

Я сделал некоторые изменения.

/// Это .h

 #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 

Здесь есть много хороших ответов, но я подумал, что некоторым может быть полезно разобрать несколько видео_ID из строки. Это может быть веб-страница или массив разных URL-адресов.

Пример содержимого страницы

 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 ) 

Кредит @Alex для регулярного выражения

Объединив некоторые из ваших ответов, я бы сказал, что это лучший ответ:

 + (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; } 

Версия Swift 2 для ответа @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 } 

Обновление Swift 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]) } 

Старый ответ:
Немного более быстрый способ @ Alex's Swift 3 ответить без использования 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.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) } 

Вот быстрая версия с использованием регулярного выражения @ jt_ik:

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

Версия Swift 3 для ответа @Alex

 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 } 

Я понял это сам …

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

Очень просто … Все видеоролики содержат v = VIDEO_ID Я просто отделил URL-адрес в массив, а затем взял первые 11 цифр того, что после v =, поскольку в URL-адресе может быть больше информации HTTP GET …

Спасибо за помощь!

  • Как получить свойство объекта в массиве объектов Objective C?
  • Динамическое обертывание текста вокруг нескольких UIImageView
  • Небезопасное свойство
  • Ниль возвратился из метода, который, как ожидается, вернет ненулевое значение
  • Как связать статическую библиотеку Cocoa Touch с проектом MonoTouch?
  • В диалоговом окне входа в SDK Facebook появляется дважды
  • Как проверить, установлен ли пользовательский делегат?
  • Как определить режим DND в приложении?
  • Веселые ошибки с использованием MPMoviePlayerViewController
  • Отрегулируйте рамку представленного представления в UIPresentationController после презентации
  • Физический движок iPhone для моделирования жидкости / воды?
  • Interesting Posts

    iOS Swift ReloadData в UITableView не обновляет UICollectionView внутри UITableViewCell

    Разница между объявлением переменной и определением в Swift

    CMake xib для компиляции nib для цели iOS

    Основные данные: извлеченный объект с индексом x имеет имя раздела без порядка «xxxxxx». Объекты должны сортироваться по названию раздела

    Время обнаружения рекламы по протоколу CoreBluetooth

    Каков наилучший способ визуализации кругов в iOS?

    Обновить контроль над таблицей, когда я вернусь, чтобы просмотреть контроллер

    Как запустить асинхронные операции в рамках крупной центральной диспетчерской операции?

    Можно ли программным образом выбрать образ запуска?

    Из приложения данные POST в браузер iOS по умолчанию

    CAGradientLayer имеет неправильную позицию после прокрутки вверх в UITableView. стриж

    Развертывание развертывания для приложения с поддержкой расширения сети

    Стиль всех UITextFields сразу, а не в каждом ViewController?

    Использование и присвоение в закрытии Swift

    Xcode 5 Загрузка URL-адреса в новый контроллер просмотра с помощью WebView в нем

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.