YouTube videoID匹配和替换

时间:2014-02-27 12:15:22

标签: ios objective-c regex nsregularexpression

我对这一点感到非常难过,而我对正则表达式的完全缺乏技巧也无济于事。

这是我想要实现的目标: - 我有多个NSStrings,其中包含我从网站上下载的博客文章中的文本(和链接)。 - 我正在使用UIWebView和我正在创建的HTML页面,以便我可以拥有内嵌图像,视频等。 - 博文包含两种类型的YouTube链接 - <iframe src="//www.youtube.com/embed/VIDEOID" height="405" width="720" allowfullscreen="" frameborder="0"></iframe>

http://youtu.be/VIDEOID

有两种不同类型的网址,因为博客使用Wordpress,而Wordpress会自动检测YouTube链接,这意味着不需要嵌入。第一种类型的嵌入也不起作用,因为它依赖于浏览器能够请求http或https(因此在URL中缺少它),这显然在UIWebViews中不起作用。

基本上我想要做的是从两种类型的URL中找到VideoID,然后从NSString中取出现有的URL,并用正确的嵌入类型替换它,并附加正确的VideoID。我还需要保持字符串的其余部分完好无损。最重要的是,它需要在同一个NSString中处理多个URL,因为每个帖子都有未知数量的视频。

这是我到目前为止的代码,但我知道这是非常错误的,我没有达到我想要的目标:

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



NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexToReplaceRawLinks
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];


NSString *modifiedString = [regex stringByReplacingMatchesInString:string
                                                           options:0
                                                             range:NSMakeRange(0, [string length])
                                                      withTemplate:@"<iframe width=\"320\" height=\"180\" src=\"http:\/\/www.youtube.com\/embed\/$1\" frameborder=\"0\" allowfullscreen><\/iframe>"];

NSLog(@"%@", modifiedString);

return modifiedString;

如果有人能指出我正确的方向,我会非常感激,尤其是正则表达式

1 个答案:

答案 0 :(得分:0)

假设//可以作为您网址的开头(正如您在示例中所示),您可以尝试使用此正则表达式:

(?:https?:)?//(?:[^.]*\.)?youtu(?:\.be|be\.com)(?:/|/embed/|/v/|/watch/?\?(?:.+&)?v=)([\w-]{11})

如果需要,只需从上方与\转义\\