parse youtube Video id с помощью preg match
Я пытаюсь проанализировать идентификатор видео URL youtube с помощью preg_match. Я нашел регулярное выражение на этом сайте, которое, кажется, работает;
(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&n]+|(?<=v=)[^&n]+
как показано на этой картинке:

мой PHP выглядит следующим образом, но он не работает (дает неизвестный модификатор '[' ошибка)...
<?
$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>";
?>
Ура
10 ответов:
Это выражение берет ID из всех различных 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-адреса может быть больше контента, который будет игнорируется)
- http://youtu.be/dQw4w9WgXcQ ...
- http://www.youtube.com/embed/dQw4w9WgXcQ ...
- http://www.youtube.com/watch?v=dQw4w9WgXcQ ...
- http://www.youtube.com/?v=dQw4w9WgXcQ ...
- http://www.youtube.com/v/dQw4w9WgXcQ ...
- http://www.youtube.com/e/dQw4w9WgXcQ ...
- http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ ...
- http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ ...
- http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ ...
- http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ ...
Он также работает на youtube-nocookie.com URL с помощью то же самое выше вариантов.
Он также вытащит идентификатор из URL-адреса в коде вставки (как iframe, так и теги объектов)
мне пришлось иметь дело с этим для класса PHP, который я написал несколько недель назад, и в итоге получил регулярное выражение, которое соответствует любым строкам: с или без схемы URL, с или без поддомена, youtube.com строки URL, 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 <[email protected]> * @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 <[email protected]> * @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; }
я усовершенствовал regex из лидер ответа. Он также захватывает идентификатор из всех различных 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);
разбор стартового параметра для BBcode (https://developers.google.com/youtube/player_parameters#start)
пример:
[yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]PHP regex:
'#\[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/?rel=0&vq=hd1080&start=" frameborder="0" allowfullscreen></iframe>'
Я не видел, чтобы кто-то напрямую обращался к ошибке PHP, поэтому я попытаюсь объяснить.
причина ошибки "неизвестный модификатор' ['"заключается в том, что вы забыли обернуть свое регулярное выражение в разделители. PHP просто принимает первый символ в качестве разделителя, если это не буквенно-цифровой, не пробеловый символ ASCII. Так что в вашем регулярном выражении:
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);PHP думает, что вы имели в виду
(в качестве разделителя. Затем он находит то, что он считает вашим закрывающим разделителем, следующим)и предполагает, что модификаторы шаблонов. Однако он обнаруживает, что ваш первый модификатор шаблона, следующий символ после первого), составляет[.[явно не является допустимым модификатором шаблона, поэтому вы получаете ошибку, которую вы делаете.решение состоит в том, чтобы просто обернуть ваше регулярное выражение в разделители и убедиться, что все разделители в регулярном выражении, которые вы хотите сопоставить, буквально экранируются. Мне нравится использовать
~в качестве разделителей, б/у вы редко должны соответствовать литерал~в regex.
использовать ниже код
$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));
Comments