анализировать идентификатор видео YouTube с помощью preg_match - PullRequest
61 голосов
/ 30 мая 2010

Я пытаюсь проанализировать идентификатор видео URL-адреса YouTube с помощью preg_match. Я нашел регулярное выражение на этом сайте, которое, кажется, работает;

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+

Как показано на этом рисунке:

alt text

Мой PHP выглядит следующим образом, но он не работает (выдает модификатор Unknown '[' error) ...

<code><?
 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

 print "<pre>";
 print_r($matches);
 print "
"; ?>

Приветствия

Ответы [ 10 ]

222 голосов
/ 17 июня 2011

Это регулярное выражение извлекает идентификатор из всех URL-адресов, которые я смог найти ... Там может быть что-то еще, но я нигде не мог найти их упоминание. Если вы обнаружите, что это не соответствует, пожалуйста, оставьте комментарий с URL, и я постараюсь обновить регулярное выражение, чтобы оно соответствовало вашему URL.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
    $video_id = $match[1];
}

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

Он также работает по URL-адресу youtube-nocookie.com с теми же параметрами, что и выше.

Он также извлекает идентификатор из URL-адреса встраиваемого кода (как iframe, так и теги объекта)

11 голосов
/ 30 мая 2010

Лучше использовать parse_url и parse_str для анализа URL и строки запроса:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);
8 голосов
/ 10 мая 2012

Мне пришлось разобраться с этим для класса PHP, который я написал несколько недель назад, и в итоге получил регулярное выражение, которое соответствует любому виду строк: с или без схемы URL, с или без субдомена, строки URL youtube.com, youtu .be URL строки и работа со всеми видами сортировки параметров. Вы можете проверить это на GitHub или просто скопировать и вставить блок кода ниже:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

Чтобы объяснить регулярное выражение, вот расширенная версия:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?';    # Optional URL scheme. Either http or https.
    $pattern .= '(?:www\.)?';         #  Optional www subdomain.
    $pattern .= '(?:';                #  Group host alternatives:
    $pattern .=   'youtu\.be/';       #    Either youtu.be,
    $pattern .=   '|youtube\.com';    #    or youtube.com
    $pattern .=   '(?:';              #    Group path alternatives:
    $pattern .=     '/embed/';        #      Either /embed/,
    $pattern .=     '|/v/';           #      or /v/,
    $pattern .=     '|/watch\?v=';    #      or /watch?v=,    
    $pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
    $pattern .=   ')';                #    End path alternatives.
    $pattern .= ')';                  #  End host alternatives.
    $pattern .= '([\w-]{11})';        # 11 characters (Length of Youtube video ids).
    $pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}
5 голосов
/ 28 сентября 2014

Я усовершенствовал регулярное выражение из ответа лидера . Он также получает идентификатор со всех различных URL-адресов, но правильнее .

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
    $video_id = $match[1];
}

Кроме того, он корректно обрабатывает неправильные идентификаторы, длина которых превышает 11 символов.

http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF

2 голосов
/ 30 мая 2010

Используйте

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
1 голос
/ 07 марта 2015

Я не видел, чтобы кто-то напрямую обращался к ошибке PHP, поэтому я попытаюсь объяснить.

Причиной ошибки "Неизвестный модификатор" ['"является то, что вы забыли обернуть свое регулярное выражение в разделители. PHP просто принимает первый символ в качестве разделителя, если это не алфавитно-цифровой, не пробельный символ ASCII. Итак, в вашем регулярном выражении:

preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

PHP думает, что вы имели в виду ( как начальный разделитель. Затем он находит то, что он считает вашим закрывающим разделителем, следующий ) и предполагает, что следующие являются модификаторами шаблона. Однако он обнаруживает, что ваш первый модификатор шаблона, следующий символ после первого ), имеет значение [. [ явно не является допустимым модификатором шаблона, поэтому вы получаете сообщение об ошибке.

Решение состоит в том, чтобы просто обернуть свое регулярное выражение в разделители и убедиться, что любые разделители внутри регулярного выражения, которым вы хотите соответствовать, буквально экранированы. Мне нравится использовать ~ в качестве разделителей, т.к. вам редко требуется совпадать с литералом ~ в регулярном выражении.

1 голос
/ 10 ноября 2014

Параметр Parse Start для BBcode (https://developers.google.com/youtube/player_parameters#start)

пример: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]

Регулярное выражение PHP:

'#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim'

заменить:

'<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'
1 голос
/ 14 апреля 2011

Вы забыли убежать от косой черты. Так что этот должен сделать работу:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]\/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
0 голосов
/ 05 ноября 2013

это сработало для меня.

$yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla';

$videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url));
0 голосов
/ 30 мая 2010

используйте ниже код

$url = "" // here is url of youtube video
$pattern = getPatternFromUrl($url); //this will retun video id

function getPatternFromUrl($url)
{
$url = $url.'&';
$pattern = '/v=(.+?)&+/';
preg_match($pattern, $url, $matches);
//echo $matches[1]; die;
return ($matches[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...