Разбор URL-адресов Youtube

Я пытаюсь получить все идентификаторы видео Youtube из такой строки:

https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg

Следуя это ответы, я написал код:

var re = /(?:https?://)?(?:youtu\.be/|(?:www\.)?youtube\.com/watch(?:\.php)?\?.*v=)([a-zA-Z0-9\-_]+)/g,
    str = 'https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg',
    match;

while (match = re.exec(str)) {
   if (match.index === re.lastIndex) {
      re.lastIndex++;
   }

   console.info(match[1]);
}

Но console.info показывает только последний ID 97aiSGxmizg. Что я делаю неправильно?

Сколько матчей вы ожидаете? Вам также нужно сопоставить DOQsYk8cbnE с https://www.youtube.com watch?v=DOQsYk8cbnE?

Wiktor Stribiżew 21.03.2018 14:17

@ WiktorStribiżew три совпадения: OovKTBO4aQs, DOQsYk8cbnE и 97aiSGxmizg

user9062413 21.03.2018 14:19

откуда у вас этот странный str? может быть, вы можете попросить вместо этого массив?

apple apple 21.03.2018 14:20

Попробуйте regex101.com/r/GBSiXs/1

Wiktor Stribiżew 21.03.2018 14:20

если вы получаете только URL-адреса YouTube, то почему бы вам просто не проверить "v = " (какое-то значение) ""

Daniel Gale 21.03.2018 14:20

@ WiktorStribiżew извините, в str допущена опечатка. Теперь все в порядке, но код по-прежнему работает не так, как я хочу

user9062413 21.03.2018 14:21

@DanielGale в общем случае youtube имеет много типов URL-адресов, поэтому я взял это регулярное выражение, потому что оно работает для всех типов URL-адресов.

user9062413 21.03.2018 14:23

@mplungjan, конечно, я могу разделить строку пробелами, но я полагаю, что это не оптимальное решение

user9062413 21.03.2018 14:26

@TroyHambleton, ваше регулярное выражение неверно. его совпадающие пробелы между ними

Shrihari Balasubramani 21.03.2018 14:26

@ShrihariBalasubramani, но здесь хорошо работает regex101.com/r/Peu4Oq/1

user9062413 21.03.2018 14:27

@ShrihariBalasubramani, как мне обновить это регулярное выражение, чтобы оно работало? regex101.com/r/Peu4Oq/2

user9062413 21.03.2018 14:30

var re = /(?:https?://)?(?:youtu\.be/|(?:www\.)?youtube\.com/watc‌ h (?: \. php) ? \? [^] * v =) ([a-zA-Z0-9 \ -_] +) / г; Пожалуйста, проверьте мой ответ, чтобы узнать больше

Shrihari Balasubramani 21.03.2018 14:36

@TroyHambleton Я не думаю, что вы охватываете все сценарии. URL-адреса YouTube бывают разных видов, кроме v=. Хотя этот вопрос не отвечает на ваш вопрос и связан с php, он перечисляет несколько форматов URL-адресов YouTube в самом вопросе: stackoverflow.com/questions/7693218/…, например https://thewikihow.com/video_97aiSGxmizg или http://www.youtube.com/v/97aiSGxmizg

Nope 21.03.2018 14:40

@TroyHambleton в сочетании с картой, не проблема

mplungjan 21.03.2018 14:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
14
115
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Ваше регулярное выражение неверно.

Правильное регулярное выражение будет таким:

var re = /(?:https?://)?(?:youtu\.be/|(?:www\.)?youtube\.com/watch(?:\.php)?\?[^ ]*v=)([a-zA-Z0-9\-_]+)/g;

var str = 'https://thewikihow.com/video_OovKTBO4aQs jiberish https://thewikihow.com/video_DOQsYk8cbnE  jiberish a https://thewikihow.com/video_97aiSGxmizg'
console.info(str.match(re))

Как вы можете видеть в минимальный воспроизводимый пример, который я сделал из вашего ответа, результат не является списком идентификаторов, поскольку вы не показываете захваты.

mplungjan 21.03.2018 15:51

Группа захвата будет соответствовать только последнему совпадению в этой строке.

Разделите строки на массив и зарегистрируйте их там:

var re = /(?:https?://)?(?:youtu\.be/|(?:www\.)?youtube\.com/watch(?:\.php)?\?.*v=)([a-zA-Z0-9\-_]+)/g,
  str = 'https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg',
  strs = str.split(' ');


strs.forEach((str) => {
  var match;
  while (match = re.exec(str)) {
    if (match.index === re.lastIndex) {
      re.lastIndex++;
    }
    console.info(match[1]);
  }
})

Не нужно делить пространство

mplungjan 21.03.2018 15:49

Предполагая, что v = something, попробуйте это (регулярное выражение из Извлечь значение параметра из url-адреса с помощью регулярных выражений)

var regex = /\?v=([a-z0-9\-]+)\&?/gi, matches = [], index=1;
urls = "https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg";
while (match = regex.exec(urls)) matches.push(match[index])
console.info(matches)

Основываясь на формате опубликованной строки, v=id, можно сделать что-то столь же простое, как разделить строку в пространстве и снова, в сочетании с reduce(), в v=, чтобы получить успешно разделенные идентификаторы.

Я также использовал анонимную функцию (function(){...})();, чтобы запустить разделение только один раз.

Фрагмент стека

var str = 'https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg';

var list = str.split(' ').reduce(function(r, e) {
  (function(i){
    if (i.length > 1) r.push(i[1]);
  })(e.split('v='));  
  return r;
}, []);

console.info(list);

Как уже упоминалось, если есть другие форматы, можно легко использовать регулярное выражение, например

Фрагмент стека

var str = 'https://thewikihow.com/video_OovKTBO4aQs https://thewikihow.com/video_DOQsYk8cbnE https://thewikihow.com/video_97aiSGxmizg http://www.youtube.com/v/-wtIMTCHWuI https://thewikihow.com/video_-DOQsYk8cbnE';

var list = str.split(' ').reduce(function(r, e) {
  (function(i){
    if (i.length > 1) r.push(i[1]);
  })(e.split(/v=|v/-|be/-/));
  return r;
}, []);

console.info(list);

Другие вопросы по теме