Подтвердить что ты не робот

Проверка 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";
}

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

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

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

4b9b3361

Ответ 1

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

$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-адресах.

Ответ 2

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

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

В то время как это больше кода, он более читабельен и, следовательно, более удобен в обслуживании.

Ответ 3

Попробуйте:

// 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";
}

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

Ответ 4

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

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

Ответ 5

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

Формат для идентификатора видео YouTube - https://webapps.stackexchange.com/a/101153/141734 p >


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

Для 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]