Holen Sie sich die YouTube-Video-ID von der URL mit PHP
Lesezeit: 4 Minuten
Matt
Ich versuche, eine Funktion zu erstellen, die einen Wert aus einem benutzerdefinierten WordPress-Feld (“_videourl” für eine YouTube-Video-URL) aufruft und dann PHP-Trim verwendet, um ihn auf die YouTube-Video-ID zu reduzieren. Ich habe eine Javascript-Funktion gefunden, die URLs nur auf die ID reduziert, aber ich habe keine Ahnung, wie ich das in PHP übersetzen könnte (Funktion unten):
function youtubeIDextract(url)
{
var youtube_id;
youtube_id = url.replace(/^[^v]+v.(.{11}).*/,"$1");
return youtube_id;
}
Diese PHP-Funktion würde innerhalb der Schleife verwendet, also ich Überlegen Ich müsste Variablen verwenden, aber ich bin wirklich nur ein Noob, also habe ich keine Ahnung, was ich tun soll. Kann mir jemand helfen, indem er sein Programmier-Know-how bei der Erstellung einer PHP-Funktion teilt?
EDIT:GELÖST
Nach einigem Probieren fand ich eine Lösung. Ich wollte es zurückgeben und posten, damit auch andere Bedürftige einen Ausgangspunkt haben.
function getYoutubeId($ytURL)
{
$urlData = parse_url($ytURL);
//echo '<br>'.$urlData["host"].'<br>';
if($urlData["host"] == 'www.youtube.com') // Check for valid youtube url
{
$ytvIDlen = 11; // This is the length of YouTube's video IDs
// The ID string starts after "v=", which is usually right after
// "youtube.com/watch?" in the URL
$idStarts = strpos($ytURL, "?v=");
// In case the "v=" is NOT right after the "?" (not likely, but I like to keep my
// bases covered), it will be after an "&":
if($idStarts === FALSE)
$idStarts = strpos($ytURL, "&v=");
// If still FALSE, URL doesn't have a vid ID
if($idStarts === FALSE)
die("YouTube video ID not found. Please double-check your URL.");
// Offset the start location to match the beginning of the ID string
$idStarts +=3;
// Get the ID string and return it
$ytvID = substr($ytURL, $idStarts, $ytvIDlen);
return $ytvID;
}
else
{
//echo 'This is not a valid youtube video url. Please, give a valid url...';
return 0;
}
}
Löst dies Ihr Problem: stackoverflow.com/questions/2936467/… ?
– Peter Boughton
28. August 2011 um 14:23 Uhr
Ich bezweifle stark, dass YouTube-Video-IDs immer 11 Zeichen lang sind. Ihre Regex kann falsch sein.
– MartinodF
28. August 2011 um 14:23 Uhr
Ich habe einige hilfreiche Tipps im Link Peter gefunden, aber es scheint, dass keine Lösungen die zusätzlichen Argumente am Ende herausfiltern konnten (was ich auch brauche). Ich habe etwas recherchiert und das hier gefunden: halgatewood.com/php-get-the-youtube-video-id-from-a-youtube-url aber ich bin mir nicht sicher, wie ich es ändern soll, um den benutzerdefinierten Feldwert für das Feld „_videoembed“ zu erhalten.
– Matt
28. August 2011 um 17:29 Uhr
@MartinodF- Tatsächlich sind sie genau 11 Zeichen lang.
– Benjam
9. September 2011 um 2:05 Uhr
mögliches Duplikat von YouTube-ID aus URL-Regex-Muster abrufen
– T. Todua
10. Juli 2014 um 16:41 Uhr
Ich musste mich damit für eine PHP-Klasse auseinandersetzen, die ich vor ein paar Wochen geschrieben habe, und endete mit einer Regex, die mit allen Arten von Strings übereinstimmt: Mit oder ohne URL-Schema, mit oder ohne Subdomain, youtube.com-URL-Strings, youtu.be-URL Zeichenfolgen und der Umgang mit allen Arten von Parametersortierungen. Sie können es überprüfen bei GitHub oder kopieren Sie einfach den folgenden Codeblock und fügen Sie ihn ein:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @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;
}
Um die Regex zu erklären, hier ist eine verschüttete Version:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @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;
}
Ich kann bestätigen, dass dies bei mir funktioniert hat. Super Lösung und Erklärung!
– Michael J. Calkins
27. Februar 2013 um 19:46 Uhr
Unter der Annahme, dass die Regex korrekt ist, könnten Sie verwenden preg_replace
Löst dies Ihr Problem: stackoverflow.com/questions/2936467/… ?
– Peter Boughton
28. August 2011 um 14:23 Uhr
Ich bezweifle stark, dass YouTube-Video-IDs immer 11 Zeichen lang sind. Ihre Regex kann falsch sein.
– MartinodF
28. August 2011 um 14:23 Uhr
Ich habe einige hilfreiche Tipps im Link Peter gefunden, aber es scheint, dass keine Lösungen die zusätzlichen Argumente am Ende herausfiltern konnten (was ich auch brauche). Ich habe etwas recherchiert und das hier gefunden: halgatewood.com/php-get-the-youtube-video-id-from-a-youtube-url aber ich bin mir nicht sicher, wie ich es ändern soll, um den benutzerdefinierten Feldwert für das Feld „_videoembed“ zu erhalten.
– Matt
28. August 2011 um 17:29 Uhr
@MartinodF- Tatsächlich sind sie genau 11 Zeichen lang.
– Benjam
9. September 2011 um 2:05 Uhr
mögliches Duplikat von YouTube-ID aus URL-Regex-Muster abrufen
– T. Todua
10. Juli 2014 um 16:41 Uhr