RegEx для соответствия идентификатору вставки YouTube - PullRequest
1 голос
/ 10 мая 2019

Я использую нестандартный JavaScript, и у меня есть строка, определенная следующим образом:

"//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0"

Я хочу вытащить только DmYK479EpQc, но я не знаю длину. Я знаю, что я хочу то, что после / и до ?

Есть ли несколько простых строк JavaScript, которые могли бы решить эту проблему?

Ответы [ 6 ]

2 голосов
/ 10 мая 2019

Использовать объект URL?

console.log(
   (new URL("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0", location.href)).pathname
   .split('/')
   .pop());

Почему? Потому что я, вероятно, могу составить URL, который побеждает регулярное выражение (хотя для YouTube это, вероятно, маловероятно)

1 голос
/ 10 мая 2019

Как насчет не-регулярных выражений

console.log("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0".split('/').pop().split('?')[0]);
1 голос
/ 10 мая 2019

Это выражение может помочь вам сделать это, и оно может быть быстрее:

(d\/)([A-z0-9]+)(\?)

enter image description here

Graph

Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения в этой ссылке :

enter image description here

const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const str = `//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0`;
const subst = `$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Тест производительности

Этот фрагмент JavaScript показывает производительность этого выражения с помощью простого цикла for, равного миллиону раз.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
	const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
	var match = string.replace(regex, "$3");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
0 голосов
/ 10 мая 2019

Вы можете использовать это регулярное выражение

.* совпадение и потреблять все до [A-z0-9]+, затем сопоставлять и захватывать любое число и символ между Az .*, а затем использовать оставшуюся часть ввода

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const position = '$3';

let result = ytUrl.replace(regex, position);

console.log('YouTube ID: ', result);

Это регулярное выражение просто разбивает строку на разные разделы, а идентификатор YouTube находится на 3-й позиции.

Другое решение использует split.Этот метод разбивает строку на массив подстрок.

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';

let result = ytUrl.split('/').pop().split('?').shift()

console.log('YouTube ID: ', result);

В этом примере мы разделяем URL, используя / в качестве разделителя.Затем мы взяли последний элемент массива методом pop.и, наконец, мы снова разделяем, используя ? в качестве разделителя, и мы берем первый элемент массива с помощью метода shift.

0 голосов
/ 10 мая 2019

Я не собираюсь давать фрагмент кода, потому что это относительно простой алгоритм, и его легко реализовать.

Обратите внимание, что эти ссылки имеют этот формат (поправьте меня, если я ошибаюсь):

  • https:// или http://
  • www.youtube.com/
  • embed/
  • Идентификатор видео (DmYK479EpQc в данном случае)
  • ?parameters (обратите внимание, что они ВСЕГДА начинаются с символа ?)

Требуется идентификатор видео, чтобы можно было разбить строку на эти разделы иесли вы храните эти секции в одном массиве, вы можете быть уверены, что идентификатор находится на 3-й позиции.

Один пример того, как этот массив будет выглядеть, будет:

['https://', 'www.youtube.com', 'embed', 'DmYK479EpQc', '?vq=hd720&rel=0']

0 голосов
/ 10 мая 2019

Один вариант использует замену регулярного выражения:

var url = "//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0";
var path = url.replace(/.*\/([^?]+).*/, "$1");
console.log(path);

Приведенный выше шаблон регулярных выражений говорит:

.*       match and consume everything up to and
/        including the last path separator
([^?]+)  then match and capture any number of non ? characters
.*       then consume the rest of the input

Затем мы просто заменим первую группу захвата, которая соответствует тексту после последнегоразделитель пути, но до начала строки запроса, если URL есть.

...