проанализировать идентификатор видео YouTube с помощью preg_match

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

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

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

alt text

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

 <? $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 "</pre>"; ?> 

ура

Это регулярное выражение захватывает идентификатор из всех различных 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, так и теги объектов)

Лучше использовать 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); 

Мне пришлось иметь дело с этим для PHP-класса, который я написал несколько недель назад, и закончил с регулярным выражением, которое соответствует любому типу строк: с или без схемы URL, с или без субдомена, строки URL youtube.com, URL youtu.be строк и обработки всех видов сортировки параметров. Вы можете проверить это в 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; } 

Я усовершенствовал регулярное выражение из ответа лидера . Он также захватывает идентификатор из всех 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

использование

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

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

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

Параметр запуска Parse для 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>' 

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

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

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

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

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

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

 $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]); } 

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

 $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)); 

Regex, вероятно, лучший подход, но более простой – просто взорвать URL-адрес, как это, и ограничить ответ.

 $youtube_url = 'http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla'; $youtube_id = substr(explode("v=", $youtube_url), 0, 7));