从URL获取YouTube视频ID w/PHP
我试图创建一个函数,它调用一个来自Wordpress自定义字段的值(“_videourl”为YouTube视频URL),然后使用PHP剪裁将其剪裁为YouTube视频ID。我发现,减少了网址只是ID的JavaScript函数,但我不知道我怎么会能够翻译成PHP(以下功能):从URL获取YouTube视频ID w/PHP
function youtubeIDextract(url)
{
var youtube_id;
youtube_id = url.replace(/^[^v]+v.(.{11}).*/,"$1");
return youtube_id;
}
这个PHP函数将在循环内部使用所以我认为我将不得不使用变量,但我真的只是一个小白,所以我不知道该怎么做。任何人都可以通过分享他们的编码专业知识来帮助我创建PHP函数吗?
编辑:解决
一些实验后,我找到了解决办法。我想返回并发布它,以便其他需要的人也可以从某个地方开始。
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;
}
}
假设正则表达式是正确的,你可以使用preg_replace
$youtubeId = preg_replace('/^[^v]+v.(.{11}).*/', '$1', $url);
您还可能有兴趣在str_replace
或substr
作为替代品。
我不得不处理这个问题,因为我几个星期前写了一个PHP类,最后是一个匹配任何类型字符串的正则表达式:带或不带URL的方案,带或不带子域,youtube.com URL字符串, youtu.be URL字符串并处理所有类型的参数排序。你可以检查出来at GitHub或简单地复制和粘贴下面的代码块:
/**
* 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;
}
要解释的正则表达式,这里有一个溢出的后续版本:
/**
* 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;
}
我可以证实这对我有效。优秀的解决方案和解释 –
非常好,谢谢你的解释。 – Sarah
这是否解决您的问题:HTTP:// *.com/questions/2936467/parse-youtube-video-id-using-preg-match/6382259#6382259? –
我很怀疑YouTube的视频ID总是11个字符。你的正则表达式可能是错误的。 – MartinodF
我在链接Peter中发现了一些有用的提示,但似乎没有任何解决方案能够在最后过滤出额外的参数(这也是我所需要的)。我正在做一些研究,并发现这一点:http://www.halgatewood.com/php-get-the-youtube-video-id-from-a-youtube-url/,但我不知道如何改变它获取字段'_videoembed'的自定义字段值 – Matt