如何使用 Dart 解析 YouTube URL 以从 URL 获取视频 ID?

fel*_*eno 0 javascript youtube dart

我正在尝试将 *this 函数转换为 Dart,但到目前为止尚未成功。我对正则表达式的部分有点困惑。我的实现使用 regExp.allMatches***(url)***aways 返回整个 url。

JavaScript 版本:

function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}
Run Code Online (Sandbox Code Playgroud)

WIP Dart 版本:

  RegExp regExp = new RegExp(
    r'.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*',
    caseSensitive: false,
    multiLine: false,
  );

  final match = regExp.allMatches(url);
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?

编辑:

输入网址:

  final urls = [
    'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
    'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
    'http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0',
    'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
    'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
    'http://www.youtube.com/watch?v=0zM3nApSvMg',
    'http://youtu.be/0zM3nApSvMg',
  ];
Run Code Online (Sandbox Code Playgroud)

每个 getYoutubeVideoId(url) 的输出应该是0zM3nApSvMg

提前致谢,

费利佩

jul*_*101 5

好吧,我没有完整的解决方案,但我希望这会对您有所帮助,您的问题是您正在使用 RegExp 它将结果作为您需要选择的组返回:

final urls = [
  'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
  'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
  'http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0',
  'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
  'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
  'http://www.youtube.com/watch?v=0zM3nApSvMg',
  'http://youtu.be/0zM3nApSvMg',
];

void main() {
  RegExp regExp = new RegExp(
    r'.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*',
    caseSensitive: false,
    multiLine: false,
  );

  for (final url in urls) {
    final match = regExp.firstMatch(url).group(1); // <- This is the fix
    print('$url -> $match');
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码将返回:

final urls = [
  'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
  'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
  'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0',
  'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
  'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
  'http://www.youtube.com/watch?v=0zM3nApSvMg',
  'http://youtu.be/0zM3nApSvMg',
];

void main() {
  RegExp regExp = new RegExp(
    r'.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*',
    caseSensitive: false,
    multiLine: false,
  );

  for (final url in urls) {
    final match = regExp.firstMatch(url).group(1); // <- This is the fix
    print('$url -> $match');
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,某些 URL 仍然存在一些问题,但我希望我的解决方案能够帮助您使 RegExp 正常工作。