Ich habe ein Textfeld, in das Benutzer etwas schreiben können.
Zum Beispiel:
Lorem Ipsum ist einfach Dummy-Text . http://www.youtube.com/watch?v=DUQi_R4SgWo des Druckens und Satzes Industrie. Lorem Ipsum war der Industrie-Standard-Dummy-Text aller Zeiten seit den 1500er Jahren, als eine unbekannte Drucker nahm eine Galeere vom Typ und verschlüsselte es, um eine Art Probe zu machen Buch. Es hat nicht nur fünf überlebt Jahrhunderte, aber auch der Sprung in elektronischer Satz, verbleibend im Wesentlichen unverändert . http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu Es wurde in den 1960er Jahren mit .__ populär gemacht. die Freigabe von Letraset-Blättern Lorem Ipsum Passagen enthält, und in jüngerer Zeit mit dem Desktop Publishing Software wie Aldus PageMaker einschließlich Versionen von Lorem Ipsum.
Jetzt möchte ich es analysieren und alle YouTube-Video-URLs und ihre IDs finden.
Irgendeine Idee, wie das funktioniert?
Eine YouTube-Video-URL kann in verschiedenen Formaten vorkommen:
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
Hier ist eine PHP - Funktion mit einem kommentierten regulären Ausdruck, der jedem dieser URL-Formulare entspricht und diese in Links umwandelt (sofern es sich nicht bereits um Links handelt):
// 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 beenden.
Und hier ist eine JavaScript-Version mit genau demselben Regex (mit entfernten Kommentaren):
// 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>');
}
Anmerkungen:
$1
."http://www.youtube.com/watch?v=VIDEO_ID"
-Stil-URL und setzt den Link-Text auf: "YouTube link: VIDEO_ID"
. Edit 2011-07-05: -
Bindestrich zur ID-Zeichenklasse hinzugefügt
Edit 2011-07-17: Reguläre Ausdrücke wurden korrigiert, um einen verbleibenden Teil (z. B. Abfrage) der URL nach der YouTube-ID zu verbrauchen. 'i'
ignore-case Modifikator hinzugefügt. Funktion in camelCase umbenannt. Verbesserter Pre-Linked-Lookahead-Test.
Edit 2011-07-27: Neue "user" - und "ytscreeningroom" -Formate von YouTube-URLs hinzugefügt.
Edit 2011-08-02: Vereinfacht, um neue "any/thing/goes" -Youtube-URLs zu verarbeiten.
Bearbeiten 2011-08-25: Mehrere Modifikationen:
linkifyYouTubeURLs()
function.\b
-Wortbegrenzungsanker um die VIDEO_ID verwendet. Dies funktioniert jedoch nicht, wenn die VIDEO_ID mit einem -
-Strich beginnt oder endet. Behoben, so dass diese Bedingung behandelt wird.+
und %
zur Zeichenklasse hinzugefügt, die der Abfragezeichenfolge entspricht.%
in a: ~
geändert. Bearbeiten 2011-10-12: Der Teil des YouTube-URL-Hosts kann jetzt eine beliebige Unterdomäne haben (nicht nur www.
).
Edit 2012-05-01: Der URL-Abschnitt zum Verbrauchen kann jetzt '-' zulassen.
Bearbeiten 2013-08-23: Zusätzliches Format hinzugefügt von @Mei. (Der Abfrageteil kann einen .
Punkt haben.
Edit 2013-11-30: Zusätzliches Format hinzugefügt von @CRONUS: youtube-nocookie.com
.
Edit 2016-01-25: Regex korrigiert, um den von CRONUS bereitgestellten Fehlerfall zu behandeln.
Hier ist eine Methode, die ich einmal für ein Projekt geschrieben habe, das Videoschlüssel von YouTube und Vimeo extrahiert:
/**
* 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;
}
Während die Antwort von ridgerunner die Basis für meine Antwort ist, löst sich diese NICHT für alle URLs auf, und ich glaube nicht, dass sie dazu in der Lage ist, aufgrund mehrerer möglicher Übereinstimmungen von VIDEO_ID
in einer YouTube-URL. Mein Regex schließt seinen aggressiven Ansatz als letzten Ausweg ein, versucht jedoch zuerst alle gängigen Übereinstimmungen, wodurch die Wahrscheinlichkeit eines falschen Übereinstimmungen später in der URL erheblich reduziert wird.
Diese Regex:
/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;
Behandelt alle Fälle, auf die ursprünglich in Ridgerunners-Beispielen verwiesen wurde, sowie alle URLs, die später in der URL eine 11-stellige Folge haben. dh:
http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit
Hier ist ein Funktionsbeispiel, das alle Beispiel-YouTube-URLs testet:
Versuchen
[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
Sie finden die Video-IDs in der ersten Erfassungsgruppe. Was ich nicht weiß ist, was ist eine gültige Video-ID? Im Moment überprüfe ich auf v=
und fange alle -A-Za-z0-9_
ein.
Ich habe es online hier auf Rubular mit Ihrem Sample-String geprüft.
Benutzen:
<?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
?>
Okay, ich habe meine eigene Funktion gemacht. Ich glaube aber, dass es ziemlich ineffizient ist.
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;
}
Ich habe einen einfachen Ausdruck versucht, um nur die Video-ID zu erhalten:
[?&]v=([^&#]*)
Prüfen Sie es online hier bei phpliveregex .
Das ursprüngliche Poster fragte "Ich möchte es analysieren und alle YouTube-Video-URLs und ihre IDs finden." Ich habe die populärste Antwort oben auf preg_match umgestellt und die Video-ID und die URL zurückgegeben.
YouTube-URL und -ID vom Post abrufen:
$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;
}
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);
}
Dieser Code in Java funktioniert derzeit für alle Youtube-URLs absolut einwandfrei.
Finden Sie einen YouTube-Link einfach über eine Zeichenfolge:
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)