我找不到匹配这些Youtube链接的正则表达式,我真的不知道我在看什么

https://www.youtube.com/watch?v=2BS3oePljr8

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

http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related

http://youtu.be/iwGFalTRHDA

http://youtu.be/n17B_uFF4cA

http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4

http://www.youtube.com/watch?v=t-ZRX8984sc

http://youtu.be/t-ZRX8984sc

我不确定是否可以在这里输入正则表达式来涵盖其中大多数内容,但请寻求帮助。

错误(尝试加载/播放视频时):
[XCDYouTubeKit] No signature function in player script

[XCDYouTubeKit] Video operation finished with error: This video is unavailable.

Domain: XCDYouTubeVideoErrorDomain

Code:   150

NSLocalizedDescription = "This video is unavailable.";

NSURL = "https://www.youtube.com/get_video_info?el=embedded&hl=en&ps=default&video_id=2BS3oePljr8";

码:
  NSArray<NSString *>*patterns = @[@"\\.sig\\|\\|([a-zA-Z0-9$]+)\\(",

                                 @"[\"']signature[\"']\\s*,\\s*([^\\(]+)",

                                 @"yt\\.akamaized\\.net/\\)\\s*\\|\\|\\s*.*?\\s*c\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(?:encodeURIComponent\\s*\\()?([a-zA-Z0-9$]+)\\(",

                                 @"\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(?:encodeURIComponent\\s*\\()?\\s*([a-zA-Z0-9$]+)\\(",

                                  @"\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*\\([^)]*\\)\\s*\\(\\s*([a-zA-Z0-9$]+)\\("
                                 ];

这里也有这个:
//在此处查看正则表达式模式列表https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1179

但是,老实说,这对我来说就像象形文字。

播放YouTube视频的其他代码:
  XCDYouTubeClient.default().getVideoWithIdentifier("2BS3oePljr8") { (video: XCDYouTubeVideo?, error: Error?) in
            if let streamURL = video?.streamURLs[XCDYouTubeVideoQuality.medium360.rawValue] {
                player = AVPlayer(url: streamURL)
                playerLayer = AVPlayerLayer(player: player)
                let playerLayerView = UIView()
                playerLayerView.frame.size = CGSize(width: self.page3View.frame.width / 1.25, height: self.page3View.frame.height / 2)
                playerLayerView.center = CGPoint(self.page3View.frame.width * 0.5, self.page3View.frame.height * 0.5)
                playerLayer.frame = CGRect(0.0, 0.0, playerLayerView.frame.width, playerLayerView.frame.height)
                playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                playerLayer.zPosition = 2
                playerLayer.backgroundColor = UIColor.black.cgColor
                playerLayerView.layer.addSublayer(playerLayer)
                self.page3View.insertSubview(playerLayerView, at: 2)
                player.seek(to: kCMTimeZero)
                player.play()

最佳答案

这个表达

https?:\/\/(?:www\.)?(youtu(\.?be)?(\.com)?)\/(?:embed\/)?(?:watch\?(?:feature=player_embedded&)?v=)?([A-Za-z0-9_-]{11})
似乎正在传递我们想要的输入,我的猜测是您可能希望提取使用此捕获组捕获的那些ID,
([A-Za-z0-9_-]{11})
并且您可能想要检查所有所需的字符是否已包含在此char类中:
[A-Za-z0-9_-]
如果不是简单地添加那些。

如果希望进一步探索或修改表达式,请在this demo的右上方面板中另外说明,如果需要,可以在this link中观察它与某些示例输入的匹配方式。

或者,如果我们希望捕获URL的各个组成部分,则可以将更多捕获组集成到表达式中,而不是非捕获组:
^https?:\/\/(www\.)?((music\.)?youtu(\.?be)?(\.com)?)\/(embed\/)?(watch\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$
并且我们所需的ID在这个冗长的表达式中位于捕获组$10中,尽管设计起来并没有那么复杂。
如何为所有URL设计一个表达式?
我们只列出所有可能的URL,然后首先捕获11位数字的ID,然后在ID的左侧为URL的不同组成部分添加可选组?
DEMO
转义
看来,为了转义元字符,我们会将反斜杠加倍,用\\代替\,例如,我们的模式可能类似于:
^https?:\\/\\/(www\\.)?((music\\.)?youtu(\\.?be)?(\\.com)?)\\/(embed\\/)?(watch\\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$
您可以进一步检查this demo,以查看注释中提供的示例中转义的变化。
RegEx电路
jex.im可视化正则表达式:
javascript - XCDYouTubeKit播放器脚本中没有签名功能-LMLPHP
参考
Swift regular expression format?
NSRegularExpression

关于javascript - XCDYouTubeKit播放器脚本中没有签名功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56913136/

10-09 18:21
查看更多