Intereting Posts

Проверка URL Youtube с использованием Regex

Я пытаюсь проверить URL-адреса YouTube для своего приложения.

Пока у меня есть следующее:

// Set the youtube URL $youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk"; if (preg_match("/((http\:\/\/){0,}(www\.){0,}(youtube\.com){1} || (youtu\.be){1}(\/watch\?v\=[^\s]){1})/", $youtube_url) == 1) { echo "Valid"; else { echo "Invalid"; } 

Я хочу проверить следующие варианты юутов:

  • С и без http: //
  • С и без www.
  • С URL-адресами youtube.com и youtu.be
  • Должен иметь / смотреть? V =
  • Должен иметь уникальную видео-строку (в примере выше «vpfzjcCzdtCk»)

Тем не менее, я не думаю, что у меня есть моя логика, потому что по какой-то причине она верна для: www.youtube.co/watch?v=vpfzjcCzdtCk (обратите внимание, что я написал ее неправильно с .co а не .com )

В этом регулярном выражении есть много увольнений (а также синдром наклонившейся зубочистки ). Это, однако, должно привести к результатам:

 $rx = '~ ^(?:https?://)? # Optional protocol (?:www[.])? # Optional sub-domain (?:youtube[.]com/watch[?]v=|youtu[.]be/) # Mandatory domain name (w/ query string in .com) ([^&]{11}) # Video id of 11 characters as capture group 1 ~x'; $has_match = preg_match($rx, $url, $matches); // if matching succeeded, $matches[1] would contain the video ID 

Некоторые примечания:

  • используйте символ тильды ~ качестве разделителя, чтобы избежать LTS
  • используйте [.] вместо \. для улучшения визуальной четкости и избежания LTS. («Специальные» символы, такие как точка . – не действуют в классах символов (в квадратных скобках))
  • чтобы сделать регулярные выражения более «читабельными», вы можете использовать модификатор x (который имеет дополнительные последствия, см. документы по модификаторам Шаблонов ), что также допускает комментарии в регулярных выражениях
  • захват может быть подавлен с использованием неадаптивных групп: (?: <pattern> ) . Это делает выражение более эффективным.

Необязательно, чтобы извлечь значения из (более или менее полного) URL-адреса, вы можете использовать parse_url() :

 $url = 'http://youtube.com/watch?v=VIDEOID'; $parts = parse_url($url); print_r($parts); 

Вывод:

 Array ( [scheme] => http [host] => youtube.com [path] => /watch [query] => v=VIDEOID ) 

Проверка имени домена и извлечение идентификатора видео оставлена ​​в качестве упражнения для читателя.


Я поддался комментаторской войне ниже; благодаря Toni Oriol, регулярное выражение теперь работает на коротких (youtu.be) URL-адресах.

Альтернативой регулярным выражениям будет parse_url() .

  $parts = parse_url($url); if ($parts['host'] == 'youtube.com' && ...) { // your code } 

Хотя это больше кода, он более читабельный и, следовательно, более удобен в обслуживании.

Пожалуйста попробуйте:

 // Set the youtube URL $youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk"; if (preg_match("/^((http\:\/\/){0,}(www\.){0,}(youtube\.com){1}|(youtu\.be){1}(\/watch\?v\=[^\s]){1})$/", $youtube_url) == 1) { echo "Valid"; } else { echo "Invalid"; } 

У вас был || в любом случае это нормально без ^ $.

Это должно сделать это:

 $valid = preg_match("/^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/watch\?v\=\w+$/", $youtube_url); if ($valid) { echo "Valid"; } else { echo "Invalid"; } 

Я откладываю на другие ответы на этой странице для синтаксического анализа синтаксиса URL-адреса, но для самих значений идентификатора YouTube вы можете быть немного более конкретными, как я описываю в следующем ответе на StackExchange / WebApps :

Формат идентификатора видео YouTubehttps://webapps.stackexchange.com/a/101153/141734


Идентификатор видео

Для videoId это 8-байтовое (64-разрядное) целое число. Применение Base64-кодирования к 8 байтам данных требует 11 символов . Однако, поскольку каждый символ Base64 передает ровно 6 бит, это распределение может фактически удерживать до 11 × 6 = 66 бит – избыток 2 бит над тем, что нам нужно для нашей полезной нагрузки. Избыточные биты устанавливаются на ноль, что приводит к исключению определенных символов из когда-либо появляющихся в последней позиции закодированной строки. В частности, videoId всегда будет заканчиваться одним из следующих:

 { A, E, I, M, Q, U, Y, c, g, k, o, s, w, 0, 4, 8 } 

Таким образом, регулярное выражение (RegEx) для videoId будет выглядеть следующим образом:

 [-_A-Za-z0-9]{10}[AEIMQUYcgkosw048] 

Идентификатор канала или списка воспроизведения

Строки channelId и playlistId создаются с помощью Base64-кодирования 128-битного (16-байтового) двоичного целого. Здесь снова вычисление на Base64 правильно предсказывает наблюдаемую длину строки в 22 символа . В этом случае выход способен кодировать 22 × 6 = 132 бит, избыток 4 бит; эти нули заканчиваются тем, что большинство из 64 символов алфавита появляются в последней позиции, и только 4 остаются в силе. Все строки channelId заканчиваются одним из следующих:

 { A, Q, g, w } 

Это дает нам регулярное выражение для channelId :

 [-_A-Za-z0-9]{21}[AQgw]