function getYoutubeVideoId($url) {
$urlParts = parse_url($url);
if($urlParts === false)
return false;
if(isset($urlParts['host']) && strtolower($urlParts['host']) === 'youtu.be')
return ltrim($urlParts['path'], '/');
if(isset($urlParts['query'])) {
parse_str($urlParts['query'], $queryParts);
if(isset($queryParts['v']))
return $queryParts['v'];
}
return false;
}
This function works great.. unless you use youtu.be/*
without http://
Why does it not work if it is just youtu.be
or www.youtu.be
?
Technically, youtu.be/foo is not a URL. A URL must have a scheme at the start, followed by ://.
ReplyDeleteSo the reason it isn't working is because you're giving the parse_url function invalid input. You must clean it up first.
Look what it returns for that input:
ReplyDeletephp> =parse_url('youtu.be/id')
array(
"path" => "youtu.be/id",
)
Perhaps if host isn't set on the result, try re-parsing with http:// prepended.
I just use:
ReplyDeletefunction getYoutubeId($url){
$parsed = parse_url($url);
parse_str($parsed['query']);
return $v;
}
Not sure if that helps...
The parse_url() function specifically does not validate the url, which is why your code would break.
ReplyDeleteTry using preg_match() and a regex to validate the url first.
if(
ReplyDelete(isset($urlParts['host']) && strtolower($urlParts['host']) === 'youtu.be'))
||
(!isset($urlParts['host'] && strstr($urlParts['path'],'/',true)=='youtu.be')
This seems to work:
ReplyDeletefunction getYoutubeVideoId($url) {
$url = str_replace('http://', '', $url);
$url = str_replace('www.', '', $url);
$urlParts = parse_url($url);
if($urlParts === false){
return false;
}
if(strstr($urlParts['path'], 'youtu.be')){
return str_replace('youtu.be/', '', $urlParts['path']);
}
if(isset($urlParts['query'])) {
parse_str($urlParts['query'], $queryParts);
if(isset($queryParts['v'])){
return $queryParts['v'];
}
}
return false;
}