ULTIMATE YOUTUBE REGEX
Сбор вишни
Поскольку объяснение становится все длиннее и длиннее, я помещаю окончательный результат вверху. Не стесняйтесь копировать + вставлять, и продолжайте свой путь. Для подробного объяснения прочитайте «полный рассказ» ниже.
/**
* JavaScript function to match (and return) the video Id
* of any valid Youtube Url, given as input string.
* @author: Stephan Schmitz <eyecatchup@gmail.com>
* @url: https://stackoverflow.com/a/10315969/624466
*/
function ytVidId(url) {
var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
return (url.match(p)) ? RegExp.$1 : false;
}
Полная история
Регулярное выражение Амаргоша выглядит хорошо, на первый взгляд. Но это:
- не соответствует идентификаторам видео, которые содержат тире (-),
- не проверяет длину идентификатора (
v=aa
и v=aaaaaaaaaaaaaaaaaa
возвращаются, чтобы быть действительными),
- и не соответствует защищенным URL-адресам вообще (http s : //youtube.com/watch? Valid_params)
Чтобы соответствовать https, символу тире и проверять длину идентификатора, это было мое первоначальное предложение относительно модифицированной версии регулярного выражения Амаргоша:
^https?:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$
ОБНОВЛЕНИЕ 1: URL-адреса и строки
После того, как я разместил вышеупомянутый шаблон, меня спросили: "Что, если URL похож на это;
youtube.com/watch?gl=US&hl=en-US&v=bQVoAWSP7k4
"?
Прежде всего, обратите внимание, что это вовсе не URL . URL-адреса, соответствующие RFC должны начинаться со схемы! ;)
В любом случае, чтобы соответствовать любой строке , которая указывает на ссылку на видео YouTube, я обновил свой ответ, чтобы исключить требуемую схему URL. Итак, мое второе предложение было следующим:
^(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$
ОБНОВЛЕНИЕ 2: окончательное регулярное выражение
Тогда меня попросили добавить поддержку «особого случая»; youtu.be короткие URL. Первоначально я не добавлял их, поскольку это не было частью вопроса. Однако теперь я обновил свой ответ: все возможные "особые случаи" . Это означает, что я добавил не только поддержку ссылок youtu.be, но и пути запросов "/ v" и "/embed".
Итак, позвольте мне представить: мое последнее и окончательное регулярное выражение на Youtube:
^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$
Какие строки совпадают?
Теперь этот шаблон будет работать для любых строк, отформатированных следующим образом:
Без схемы и субдомена (Домен: youtu.be, Путь: /)
youtu.be/<video:id>
Без схемы, с поддоменом (Домен: youtu.be, Путь: /)
www.youtu.be/<video:id>
С HTTP-схемой, без поддоменов (домен: youtu.be, путь: /)
http://youtu.be/<video:id>
С HTTP-схемой и поддоменом (домен: youtu.be, путь: /)
http://www.youtu.be/<video:id>
С использованием схемы HTTPS, без субдомена (домен: youtu.be, путь: /)
https://youtu.be/<video:id>
Со схемой HTTPS и поддоменом (домен: youtu.be, путь: /)
https://www.youtu.be/<video:id>
Без схемы и субдомена (Домен: youtube.com, Путь: / embed)
youtube.com/embed/<video:id>
youtube.com/embed/<video:id>&other_params
Без схемы, с поддоменом (Домен: youtube.com, Путь: / embed)
www.youtube.com/embed/<video:id>
www.youtube.com/embed/<video:id>&other_params
С HTTP-схемой, без субдомена (домен: youtube.com, путь: / embed)
http://youtube.com/embed/<video:id>
http://youtube.com/embed/<video:id>&other_params
С HTTP-схемой и поддоменом (домен: youtube.com, путь: / embed)
http://www.youtube.com/embed/<video:id>
http://www.youtube.com/embed/<video:id>&other_params
С HTTPS-схемой, без субдомена (Домен: youtube.com, Путь: / embed)
https://youtube.com/embed/<video:id>
https://youtube.com/embed/<video:id>&other_params
со схемой HTTPS и поддоменом (домен: youtube.com, путь: / embed)
https://www.youtube.com/embed/<video:id>
https://www.youtube.com/embed/<video:id>&other_params
Без схемы и субдомена (Домен: youtube.com, Путь: / v)
youtube.com/v/<video:id>
youtube.com/v/<video:id>&other_params
Без схемы, с поддоменом (Домен: youtube.com, Путь: / v)
www.youtube.com/v/<video:id>
www.youtube.com/v/<video:id>&other_params
С HTTP-схемой, без субдомена (домен: youtube.com, путь: / v)
http://youtube.com/v/<video:id>
http://youtube.com/v/<video:id>&other_params
С HTTP-схемой и поддоменом (домен: youtube.com, путь: / v)
http://www.youtube.com/v/<video:id>
http://www.youtube.com/v/<video:id>&other_params
С использованием схемы HTTPS, без субдомена (домен: youtube.com, путь: / v)
https://youtube.com/v/<video:id>
https://youtube.com/v/<video:id>&other_params
Со схемой HTTPS и поддоменом (домен: youtube.com, путь: / v)
https://www.youtube.com/v/<video:id>
https://www.youtube.com/v/<video:id>&other_params
Без схемы и субдомена (Домен: youtube.com, Путь: / watch)
youtube.com/watch?v=<video:id>
youtube.com/watch?v=<video:id>&other_params
youtube.com/watch?other_params&v=<video:id>
youtube.com/watch?other_params&v=<video:id>&more_params
Без схемы, с поддоменом (Домен: youtube.com, Путь: / watch)
www.youtube.com/watch?v=<video:id>
www.youtube.com/watch?v=<video:id>&other_params
www.youtube.com/watch?other_params&v=<video:id>
www.youtube.com/watch?other_params&v=<video:id>&more_params
С использованием схемы HTTP, без субдомена (домен: youtube.com, путь: / watch)
http://youtube.com/watch?v=<video:id>
http://youtube.com/watch?v=<video:id>&other_params
http://youtube.com/watch?other_params&v=<video:id>
http://youtube.com/watch?other_params&v=<video:id>&more_params
С HTTP-схемой и поддоменом (домен: youtube.com, путь: / watch)
http://www.youtube.com/watch?v=<video:id>
http://www.youtube.com/watch?v=<video:id>&other_params
http://www.youtube.com/watch?other_params&v=<video:id>
http://www.youtube.com/watch?other_params&v=<video:id>&more_params
С HTTPS-схемой, без субдомена (домен: youtube.com, путь: / watch)
https://youtube.com/watch?v=<video:id>
https://youtube.com/watch?v=<video:id>&other_params
https://youtube.com/watch?other_params&v=<video:id>
https://youtube.com/watch?other_params&v=<video:id>&more_params
Со схемой HTTPS и поддоменом (домен: youtube.com, путь: / watch)
https://www.youtube.com/watch?v=<video:id>
https://www.youtube.com/watch?v=<video:id>&other_params
https://www.youtube.com/watch?other_params&v=<video:id>
https://www.youtube.com/watch?other_params&v=<video:id>&more_params
ФУНКЦИОНАЛЬНОЕ ИСПОЛЬЗОВАНИЕ
Самый простой способ использовать шаблон - заключить его в такую функцию, как эта:
/**
* JavaScript function to match (and return) the video Id
* of any valid Youtube Url, given as input string.
* @author: Stephan Schmitz <eyecatchup@gmail.com>
* @url: https://stackoverflow.com/a/10315969/624466
*/
function ytVidId(url) {
var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
return (url.match(p)) ? RegExp.$1 : false;
}
// for example snippet only!
document.body.addEventListener('click', function(e) {
if (e.target.className == 'yt-url' && 'undefined' !== e.target.value) {
var ytId = ytVidId(e.target.value);
alert(e.target.value + "\r\nResult: " + (!ytId ? 'false' : ytId));
}
}, false);
<!-- Click the buttons to probe URLs -->
<input type="button" value="https://www.youtube.com/watch?v=p-e2G_VcTms&feature=g-logo&context=G29aead6FOAAAAAAABAA" class="yt-url">
<input type="button" value="https://www.youtube.com/latest" class="yt-url">
Если тип значения результата функции должен быть логическим значением, просто замените RegExp.$1
на true
. Вот и все.
Последнее замечание о длине видео идентификатора : Кто-то спросил, имеют ли идентификаторы фиксированную длину 11 символов? а если это может измениться в будущем?
Лучшим ответом на этот вопрос, вероятно, является также единственное "официальное" утверждение, которое я нашел здесь и которое говорит: "Я не вижу нигде в документации, где мы официально использовать стандартную длину 11 символов для идентификаторов видео YouTube. Это одна из тех вещей, где у нас есть текущая реализация, и она может оставаться такой же до бесконечности. Но мы не предлагаем никаких официальных обязательств по этому поводу, поэтому действуйте по своему усмотрению риск. "