Проанализировать идентификатор видео YouTube с помощью preg_match
Я пытаюсь проанализировать идентификатор видео URL-адреса YouTube с помощью preg_match. Я нашел регулярное выражение на этом сайте, который, кажется, работает;
(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+
Как показано на этом рисунке:
Мой 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>";
?>
ура
10 ответов
Это регулярное выражение извлекает идентификатор из всех 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...
- http://www.youtube.com/sandalsResorts...
- http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ...
- http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ...
Он также работает с 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);
Я не видел, чтобы кто-то прямо обращался к ошибке PHP, поэтому я попытаюсь объяснить.
Причиной ошибки "Неизвестный модификатор" ['"является то, что вы забыли обернуть свое регулярное выражение в разделители. PHP просто принимает первый символ в качестве разделителя, если это не алфавитно-цифровой, не пробельный символ ASCII. Итак, в вашем регулярном выражении:
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
PHP думает, что вы имели в виду (
в качестве вводного разделителя. Затем он находит то, что он считает ваш закрывающий разделитель, следующий )
и предполагает, что ниже приведены модификаторы шаблона. Однако он обнаруживает, что ваш первый модификатор шаблона, следующий символ после первого )
, является [
, [
очевидно, не является допустимым модификатором шаблона, поэтому вы получаете ошибку, которую вы делаете.
Решение состоит в том, чтобы просто обернуть свое регулярное выражение в разделители и убедиться, что любые разделители внутри регулярного выражения, которым вы хотите соответствовать буквально, экранированы. Я люблю использовать ~
в качестве разделителей, б / к вам редко нужно совпадать с литералом ~
в регулярном выражении
Параметр Parse Start для BBcode ( https://developers.google.com/youtube/player_parameters)
пример: [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>'
Это сработало для меня.
$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));
Используйте код ниже
$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]);
}