У меня есть текстовое поле, где пользователи могут писать что угодно.
Например:
Lorem Ipsum - это просто фиктивный текст. http://www.youtube.com/watch?v=DUQi_R4SgWo в полиграфической и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом в отрасли с 1500-х годов, когда неизвестный типограф взял камбуз и скремблировал его, чтобы сделать книгу образцов шрифта. Он пережил не только пять веков, но и скачок в электронный набор, оставшись практически неизменным. http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu Он был популяризирован в 1960-х годах с выпуском листов Letraset, содержащих отрывки Lorem Ipsum, а в последнее время с помощью программного обеспечения для настольных издательских систем, такого как Aldus PageMaker, включая версии Lorem Ipsum.
Теперь я хотел бы проанализировать его и найти все URL-адреса видео YouTube и их идентификаторы.
Есть идеи, как это работает?
Ответы:
URL-адреса видео YouTube могут быть представлены в различных форматах:
http://youtu.be/NLqAF9hrVbY
http://www.youtube.com/embed/NLqAF9hrVbY
https://www.youtube.com/embed/NLqAF9hrVbY
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
http://www.youtube.com/watch?v=NLqAF9hrVbY
http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
http://www.youtube-nocookie.com
Вот функция PHP с закомментированным регулярным выражением, которое соответствует каждой из этих форм URL и преобразует их в ссылки (если они еще не являются ссылками):
// Linkify youtube URLs which are not already links. function linkifyYouTubeURLs($text) { $text = preg_replace('~(?#!js YouTubeId Rev:20160125_1800) # Match non-linked youtube URL in the wild. (Rev:20130823) https?:// # Required scheme. Either http or https. (?:[0-9A-Z-]+\.)? # Optional subdomain. (?: # Group host alternatives. youtu\.be/ # Either youtu.be, | youtube # or youtube.com or (?:-nocookie)? # youtube-nocookie.com \.com # followed by \S*? # Allow anything up to VIDEO_ID, [^\w\s-] # but char before ID is non-ID char. ) # End host alternatives. ([\w-]{11}) # $1: VIDEO_ID is exactly 11 chars. (?=[^\w-]|$) # Assert next char is non-ID or EOS. (?! # Assert URL is not pre-linked. [?=&+%\w.-]* # Allow URL (query) remainder. (?: # Group pre-linked alternatives. [\'"][^<>]*> # Either inside a start tag, | </a> # or inside <a> element text contents. ) # End recognized pre-linked alts. ) # End negative lookahead assertion. [?=&+%\w.-]* # Consume any URL (query) remainder. ~ix', '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>', $text); return $text; }
; // Конец $ YouTubeId.
А вот версия JavaScript с таким же регулярным выражением (без комментариев):
// Linkify youtube URLs which are not already links. function linkifyYouTubeURLs(text) { var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*?[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig; return text.replace(re, '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>'); }
Примечания:
$1
."http://www.youtube.com/watch?v=VIDEO_ID"
URL стиля и задает текст ссылки на:"YouTube link: VIDEO_ID"
.Изменить 2011-07-05: добавлен
-
дефис в класс идентификатора charИзменить 2011-07-17: исправлено регулярное выражение для использования любой оставшейся части (например, запроса ) URL-адреса после идентификатора YouTube. Добавлен модификатор
'i'
игнорирования регистра . Функция переименована в camelCase. Улучшенный предварительный просмотр вперед с привязкой.Edit 2011-07-27: Добавлены новые форматы "user" и "ytscreeningroom" URL-адресов YouTube.
Редактировать 2011-08-02: Упрощено / обобщено для обработки новых URL-адресов YouTube "все, что угодно / идет".
Изменить 2011-08-25: несколько модификаций:
linkifyYouTubeURLs()
function.\b
привязку границы слова вокруг VIDEO_ID. Однако это не сработает, если VIDEO_ID начинается или заканчивается-
тире. Исправлено, так что он обрабатывает это условие.+
и%
в строку запроса сопоставления класса символов.%
к:~
.Изменить 2011-10-12: часть хоста URL-адреса YouTube теперь может иметь любой субдомен (не только
www.
).Изменить 2012-05-01: раздел URL-адреса потребления теперь может допускать '-'.
Изменить 2013-08-23: добавлен дополнительный формат, предоставленный @Mei. (В части запроса может быть
.
точка.Редактирование 2013-11-30: Добавлен дополнительный формат обеспечивается @CRONUS:
youtube-nocookie.com
.Изменить 2016-01-25: исправлено регулярное выражение для обработки случая ошибки, предоставленной CRONUS.
источник
Вот метод, который я однажды написал для проекта, который извлекает видео ключи YouTube и Vimeo:
/** * strip important information out of any video link * * @param string link to a video on the hosters page * @return mixed FALSE on failure, array on success */ function getHostInfo ($vid_link) { // YouTube get video id if (strpos($vid_link, 'youtu')) { // Regular links if (preg_match('/(?<=v\=)([\w\d-_]+)/', $vid_link, $matches)) return array('host_name' => 'youtube', 'original_key' => $matches[0]); // Ajax hash tag links else if (preg_match('§([\d\w-_]+)$§i', $vid_link, $matches)) return array('host_name' => 'youtube', 'original_key' => $matches[0]); else return FALSE; } // Vimeo get video id elseif (strpos($vid_link, 'vimeo')) { if (preg_match('§(?<=/)([\d]+)§', $vid_link, $matches)) return array('host_name' => 'vimeo', 'original_key' => $matches[0]); else return FALSE; } else return FALSE; }
источник
if(strpos($vid_link, 'youtu'))
захватит короткий URL-адресyoutu.be
в дополнение к общему URL-адресу.Хотя ответ Ridgerunner является основой моего ответа, он НЕ решает все URL-адреса, и я не верю, что он способен на это из-за нескольких возможных совпадений
VIDEO_ID
в URL-адресе YouTube. Мое регулярное выражение включает его агрессивный подход в качестве последнего средства, но сначала пытается выполнить все общие сопоставления, что значительно снижает вероятность неправильного сопоставления позже в URL-адресе.Это регулярное выражение:
/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-]*/ig;
Обрабатывает все случаи, изначально упомянутые в примерах ridgerunners, а также любой URL-адрес, который может иметь последовательность из 11 символов позже в URL-адресе. то есть:
http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit
Вот рабочий образец, который проверяет все образцы URL-адресов YouTube:
http://jsfiddle.net/DJSwc/5/
источник
Пытаться
Вы найдете идентификаторы видео в первой группе захвата. Я не знаю, что такое действительный идентификатор видео? На данный момент все проверяю
v=
и фиксирую-A-Za-z0-9_
.Я проверил это онлайн здесь на rubular с вашим образцом строки.
источник
Использование:
<?php // The YouTube URL string $youtube_url='http://www.youtube.com/watch?v=8VtUYvwktFQ'; // Use regex to get the video ID $regex='#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#'; preg_match($regex, $youtube_url, $id); // Plug that into our HTML ?>
источник
Хорошо, я сделал свою функцию. Но я считаю, что это довольно неэффективно. Приветствуются любые улучшения:
function get_youtube_videos($string) { $ids = array(); // Find all URLs preg_match_all('/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/', $string, $links); foreach ($links[0] as $link) { if (preg_match('~youtube\.com~', $link)) { if (preg_match('/[^=]+=([^?]+)/', $link, $id)) { $ids[] = $id[1]; } } } return $ids; }
источник
Я попробовал простое выражение, чтобы получить только videoid:
[?&]v=([^&#]*)
Проверить его работу онлайн можно здесь, на phpliveregex .
источник
Оригинальный плакат спросил: «Я хотел бы проанализировать его и найти все URL-адреса видео YouTube и их идентификаторы». Я переключил самый популярный ответ выше на preg_match и вернул идентификатор видео и URL.
Получите URL-адрес и идентификатор YouTube из сообщения:
$match[0] = Full URL $match[1] = video ID function get_youtube_id($input) { $input = preg_match('~https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:[\'"][^<>]*>|</a>))[?=&+%\w.-]*~ix', $input, $match); return $match; }
источник
Легко найти ссылку на YouTube из строки:
function my_url_search($se_action_data) { $regex = '/https?\:\/\/[^\" ]+/i'; preg_match_all($regex, $se_action_data, $matches); $get_url=array_reverse($matches[0]); return array_unique($get_url); } echo my_url_search($se_action_data)
источник
String urlid="" ; String url="http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s"; Pattern pattern =Pattern.compile("(?:http|https|)(?::\\/\\/|)(?:www.|)(?:youtu\\.be\\/|youtube\\.com(?:\\/embed\\/|\\/v\\/|\\/watch\\?v=|\\/ytscreeningroom\\?v=|\\/feeds\\/api\\/videos\\/|\\/user\\\\S*[^\\w\\-\\s]|\\S*[^\\w\\-\\s]))([\\w\\-\\_]{11})[a-z0-9;:@#?&%=+\\/\\$_.-]*"); Matcher result = pattern.matcher(url); if (result.find()) { urlid=result.group(1); }
Этот код на java в настоящее время работает абсолютно нормально для всех URL-адресов YouTube.
источник