Mam pole tekstowe, w którym użytkownicy mogą napisać wszystko.
Na przykład:
Lorem Ipsum to po prostu fikcyjny tekst. http://www.youtube.com/watch?v=DUQi_R4SgWo branży poligraficznej i składu. Lorem Ipsum jest standardowym tekstem zastępczym w branży od XVI wieku, kiedy nieznana drukarka wzięła galerię czcionek i zaszyfrowała ją, aby stworzyć książkę z wzorami. Przetrwał nie tylko pięć wieków, ale także skok do elektronicznego składu, pozostając zasadniczo niezmieniony. http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu Został spopularyzowany w latach sześćdziesiątych XX wieku wraz z wydaniem arkuszy Letraset zawierających fragmenty Lorem Ipsum, a ostatnio z oprogramowaniem do publikowania na komputerze, takim jak Aldus PageMaker, w tym wersje Lorem Ipsum.
Teraz chciałbym go przeanalizować i znaleźć wszystkie adresy URL filmów w YouTube i ich identyfikatory.
Masz jakiś pomysł, jak to działa?
Odpowiedzi:
Adres URL filmu w serwisie YouTube można napotkać w różnych formatach:
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
Oto funkcja PHP z skomentowanym wyrażeniem regularnym, która pasuje do każdego z tych formularzy URL i konwertuje je na linki (jeśli nie są już linkami):
// 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; }
; // End $ YouTubeId.
A oto wersja JavaScript z dokładnie tym samym wyrażeniem regularnym (z usuniętymi komentarzami):
// 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>'); }
Uwagi:
$1
."http://www.youtube.com/watch?v=VIDEO_ID"
stylu URL i ustawia tekst link do:"YouTube link: VIDEO_ID"
.Edycja 2011-07-05: Dodano
-
łącznik do klasy znaków IDEdycja 2011-07-17: Naprawiono wyrażenie regularne, które wykorzystywało pozostałą część (np. Zapytanie ) adresu URL po identyfikatorze YouTube. Dodano modyfikator
'i'
ignorowania wielkości liter . Zmieniono nazwę funkcji na camelCase. Ulepszony wstępnie połączony test wyprzedzenia.Edycja 2011-07-27: Dodano nowe formaty „user” i „ytscreeningroom” do adresów URL YouTube.
Edycja 02.08.2011: Uproszczona / uogólniona obsługa nowych adresów URL „cokolwiek / coś / idzie” w YouTube.
Edycja 25.08.2011: Kilka modyfikacji:
linkifyYouTubeURLs()
funkcji:.\b
zakotwiczenia granicy słowa wokół VIDEO_ID. Jednak to nie zadziała, jeśli VIDEO_ID zaczyna się lub kończy-
myślnikiem. Naprawiono tak, że obsługuje ten stan.+
i%
do ciągu zapytania pasującego do klasy znaków.%
do a:~
.Edytuj 2011-10-12: Część hosta adresu URL YouTube może teraz mieć dowolną subdomenę (nie tylko
www.
).Edycja 2012-05-01: Sekcja adresu URL konsumpcji może teraz zezwalać na „-”.
Edycja 23.08.2013: Dodano dodatkowy format dostarczony przez @Mei. (Część zapytania może mieć
.
kropkę.Edycja 30.11.2013: Dodano Format dodatkowe świadczone przez @CRONUS:
youtube-nocookie.com
.Edycja 2016-01-25: Naprawiono wyrażenie regularne obsługujące przypadki błędów dostarczane przez CRONUS.
źródło
Oto metoda, którą kiedyś napisałem dla projektu, który wyodrębnia klucze wideo YouTube i 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; }
źródło
if(strpos($vid_link, 'youtu'))
przechwyci krótki adres URLyoutu.be
oprócz zwykłego adresu URL.Chociaż odpowiedź ridgerunnera jest podstawą mojej odpowiedzi, jego NIE rozwiązuje problemu dla wszystkich adresów URL i nie wierzę, że jest w stanie to zrobić, ze względu na wiele możliwych dopasowań
VIDEO_ID
w adresie URL YouTube. Mój regex zawiera jego agresywne podejście jako ostatnią deskę ratunku, ale najpierw próbuje wszystkich typowych dopasowań, znacznie zmniejszając możliwość błędnego dopasowania w dalszej części adresu URL.To wyrażenie regularne:
/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;
Obsługuje wszystkie przypadki pierwotnie przywoływane w przykładach Ridgerunners, a także każdy adres URL, który może mieć sekwencję 11 znaków w dalszej części adresu URL. to znaczy:
http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit
Oto działający przykład, który testuje wszystkie przykładowe adresy URL YouTube:
http://jsfiddle.net/DJSwc/5/
źródło
Próbować
W pierwszej grupie przechwytywania znajdziesz identyfikatory wideo. Nie wiem, co to jest prawidłowy identyfikator wideo? W tej chwili sprawdzam
v=
i wychwytuję wszystko-A-Za-z0-9_
.Sprawdziłem to online tutaj na rubular z twoim próbnym ciągiem.
źródło
Posługiwać się:
<?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 ?>
źródło
Okej, stworzyłem własną funkcję. Ale uważam, że jest to dość nieefektywne. Wszelkie ulepszenia są mile widziane:
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; }
źródło
Spróbowałem prostego wyrażenia, aby uzyskać tylko identyfikator wideo:
[?&]v=([^&#]*)
Sprawdź, czy działa online tutaj na phpliveregex .
źródło
Oryginalny plakat pytał: „Chciałbym go przeanalizować i znaleźć wszystkie adresy URL filmów YouTube i ich identyfikatory”. Zmieniłem najpopularniejszą odpowiedź powyżej na preg_match i zwróciłem identyfikator wideo i adres URL.
Uzyskaj adres URL i identyfikator YouTube z posta:
$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; }
źródło
Znajdź łatwo link do YouTube z ciągu:
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)
źródło
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); }
Ten kod w Javie działa obecnie całkowicie dobrze dla wszystkich adresów URL YouTube.
źródło