Как найти все идентификаторы видео YouTube в строке с помощью регулярного выражения?
У меня есть текстовое поле, где пользователи могут писать что угодно.
например:
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 и их идентификаторы.
любую идею как это работает?
10 ответов:
URL видео YouTube можно встретить в различных форматах:
- последний короткий формат:
http://youtu.be/NLqAF9hrVbY
- iframe:
http://www.youtube.com/embed/NLqAF9hrVbY
- iframe (secure):
https://www.youtube.com/embed/NLqAF9hrVbY
- объект param:
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
вот метод, который я когда-то написал для проекта, который извлекает YouTube и Vimeo video keys:
/** * 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; }
- найти регулярное выражение, которое будет извлекать все ссылки из текста. Google поможет вам в этом.
- Зациклите все ссылки и вызовите getHostInfo () для каждого
в то время как ответ 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:
попробовать
[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
вы найдете идентификаторы видео в первой группе захвата. Я не знаю, что такое действительный идентификатор видео? На данный момент я проверяю
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; }
я попробовал простое выражение, чтобы получить только звукозапись:
[?&]v=([^&#]*)
проверьте его работу в интернете здесь, в phpliveregex.
оригинальный плакат спросил: "я хотел бы разобрать его и найти все URL-адреса видео YouTube и их идентификаторы."Я переключил самый популярный ответ выше на preg_match и вернул идентификатор видео и URL.
получить YouTube URL и ID из сообщения:
$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 в настоящее время.