23

NSStringまたはSwiftとしてYoutubeURLを持っていStringますが、URLに表示されているビデオIDを抽出する必要があります。PHPやその他のWebベースのプログラミング言語でこれを行う方法について多くのチュートリアルを見つけましたが、Objective-CやSwiftforAppleプラットフォームでは見つかりませんでした...

パラメータとしてNSStringURLを要求し、別のNSStringとしてビデオIDを返すメソッドを探しています...

4

17 に答える 17

39

正規表現の正しい構文を見つけるために何年も費やした後、私はこれに出会いました。

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

ここから撮影。これは、次の URL 形式で機能します。

 - www.youtube.com/v/VIDEOID  
 - www.youtube.com?v=VIDEOID
 - http://www.youtube.com/watch?v=KFPtWedl7wg&feature=youtu.be
 - http://www.youtube.com/watch?v=MkTD2Y4LXcM 
 - youtu.be/KFPtWedl7wg_U923
 - http://www.youtube.com/watch?feature=player_detailpage&v=biVLGTAMC_U#t=31s
于 2013-01-02T20:56:29.183 に答える
15

したがって、YouTube の URL は次のようになります。

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

関心のある動画 ID は最後の部分 ( oHg5SJYRHA0) です。ただし、YouTube の URL にはクエリ文字列に他のパラメーターを含めることができるため、必ずしも最後にあるとは限りません。

おそらく最善の策は、正規表現と Foundation のNSRegularExpressionクラスを使用することです。このアプローチは、あなたが見つけた他の言語のチュートリアルで使用されていると思います-正規表現の内容は、それらを含むどの言語またはツールキットでもほとんど同じであるため、これらのチュートリアルで見つかった正規表現はすべて機能するはずですあなたのために。v=(これは、正規表現がより堅牢であるさまざまなモードの失敗が発生しやすいため、壊れて正確に11文字を取るというアプローチに反対することをお勧めします。)

ビデオ ID を見つけるには、次のような正規表現が必要になる場合がありますv=([^&]+)。はv=、クエリ URL の右側の部分に移動します (のようなものを取得した場合watch?fmt=22&v=oHg5SJYRHA0)。かっこはキャプチャ グループを作成するため、ビデオ ID のみを抽出し、それを見つけるために使用した他の一致する文字は抽出できません。かっこ内で、アンパサンドではない 1 つ以上の文字のシーケンスを探します。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];
}
于 2012-07-16T18:14:08.157 に答える
9

おそらく表示されているチュートリアルは、正規表現の使用方法に関する説明にすぎません。これは、この場合にも使用したいものです。

使用する必要のあるCocoaクラスはNSRegularExpressionです。

実際の正規表現文字列は、YouTubeにいくつかあるように見えるため、URLが含まれると予想される形式によって異なります。一般的な関数は次のようになります。

+ (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;
}
于 2012-07-16T17:51:14.863 に答える
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;
}
于 2013-10-04T07:33:08.743 に答える
2

投票数が最も多かった回答を使用して、より優れた、より制限的な正規表現を作成しました。

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

するとIDが取得できます

NSTextCheckingResult *match = [regex firstMatchInString:url
                                                options:0
                                                  range:NSMakeRange(0, [url length])];
NSRange videoIDRange = [match rangeAtIndex:1];
NSString *youTubeID = [url substringWithRange:videoIDRange];
于 2014-02-28T06:45:24.383 に答える
1

@Alex回答のSwift 2バージョン

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
}
于 2016-05-25T10:10:57.233 に答える
1

ここには多くの良い答えがありますが、文字列から複数のvideo_IDを解析することは有益かもしれないと思いました。これは、Web ページまたは異なる 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へのクレジット

于 2015-04-11T04:08:59.960 に答える
1

これがStackOveFlowから参照された私のソリューションです。(新しい URL 形式の Youtube ID 解析)

私はいくつかの変更を行いました。

///これは .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
于 2013-07-22T22:05:56.320 に答える
0

@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 ""
    }
}
于 2015-01-14T18:59:27.730 に答える
0

@Alex回答の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 {
        debugPrint(firstMatch)
        return nsLink.substring(with: firstMatch.range)
    }
    return nil
}
于 2017-03-08T16:29:31.533 に答える
-2

私は自分でそれを理解しました...

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

非常に簡単です... すべてのビデオ URL には v=VIDEO_ID が含まれています。URL を配列に分割し、v= の後の最初の 11 桁を取りました。これは、URL にさらに http GET 情報が含まれている可能性があるためです...

でも助けてくれてありがとう!

于 2012-07-16T18:02:38.630 に答える