Как разобрать URL-адреса YouTube, чтобы получить идентификатор видео из URL-адреса с помощью Dart? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь преобразовать * эту функцию в Dart, но пока безуспешно. Я немного запутался в том, как часть регулярных выражений. Моя реализация с использованием regExp.allMatches *** (url) *** всегда возвращает весь 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;
}

Версия 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);

Может ли кто-нибудь помочь мне в этом?

РЕДАКТИРОВАТЬ:

Входные URL-адреса:

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

Выход для getYoutubeVideoId (url) для каждого должен быть 0zM3nApSvMg

Заранее спасибо,

Фелипе

1 Ответ

1 голос
/ 07 февраля 2020

Ну, у меня нет полного решения, но я надеюсь, что это поможет вам. Ваша проблема в том, что вы используете 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');
  }
}

Этот код вернется:

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

Как видите, с некоторыми URL-адресами все еще есть проблемы, но я надеюсь, что мое решение поможет вам запустить RegExp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...