This question has been asked before and I found this:
Reg exp for youtube link
but I'm looking for something slightly different.
I need to match the Youtube I.D itself compatible with all the possible youtube link formats. Not exclusively beginning with youtube.com.
For example:
http://www.youtube.com/watch?v=-wtIMTCHWuI
http://www.youtube.com/v/-wtIMTCHWuI?version=3&autohide=1
http://youtu.be/-wtIMTCHWuI
http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D-wtIMTCHWuI&format=json
http://s.ytimg.com/yt/favicon-wtIMTCHWuI.ico
http://i2.ytimg.com/vi/-wtIMTCHWuI/hqdefault.jpg
is there a clever strategy I can use to match the video I.D -wtIMTCHWuI
compatible with all these formats. I'm thinking character counting and matching =
?
/
.
&
characters.
I had to deal with this for a PHP class I wrote a few weeks ago and ended up with a regex that matches any kind of strings: With or without URL scheme, with or without subdomain, youtube.com URL strings, youtu.be URL strings and dealing with all kind of parameter sorting. You can check it out at GitHub or simply copy and paste the code block below:
/** * 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\.|m\.)?(?:youtu\.be/|youtube\.com/(?:embed/|v/|watch\?v=|watch\?.+&v=))([\w-]{11})(?![\w-])#'; preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; }
Test cases: https://3v4l.org/GEDT0
JavaScript version: https://stackoverflow.com/a/10315969/624466
To explain the regex, here's a split up 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, or protocol-relative. . '(?:www\.|m\.)?' # Optional www or m subdomain. . '(?:' # Group host alternatives: . 'youtu\.be/' # Either youtu.be, . '|youtube\.com/' # or youtube.com . '(?:' # Group path alternatives: . 'embed/' # Either /embed/, . '|v/' # or /v/, . '|watch\?v=' # or /watch?v=, . '|watch\?.+&v=' # or /watch?other_param&v= . ')' # End path alternatives. . ')' # End host alternatives. . '([\w-]{11})' # 11 characters (Length of Youtube video ids). . '(?![\w-])#'; # Rejects if overlong id. preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; }
I found this code this link:
<?php /** * parse_youtube_url() PHP function * Author: takien * URL: http://takien.com * * @param string $url URL to be parsed, eg: * http://youtu.be/zc0s358b3Ys, * http://www.youtube.com/embed/zc0s358b3Ys * http://www.youtube.com/watch?v=zc0s358b3Ys * @param string $return what to return * - embed, return embed code * - thumb, return URL to thumbnail image * - hqthumb, return URL to high quality thumbnail image. * @param string $width width of embeded video, default 560 * @param string $height height of embeded video, default 349 * @param string $rel whether embeded video to show related video after play or not. */ function parse_youtube_url($url,$return='embed',$width='',$height='',$rel=0){ $urls = parse_url($url); //expect url is http://youtu.be/abcd, where abcd is video iD if($urls['host'] == 'youtu.be'){ $id = ltrim($urls['path'],'/'); } //expect url is http://www.youtube.com/embed/abcd else if(strpos($urls['path'],'embed') == 1){ $id = end(explode('/',$urls['path'])); } //expect url is abcd only else if(strpos($url,'/')===false){ $id = $url; } //expect url is http://www.youtube.com/watch?v=abcd else{ parse_str($urls['query']); $id = $v; } //return embed iframe if($return == 'embed'){ return '<iframe width="'.($width?$width:560).'" height="'.($height?$height:349).'" src="http://www.youtube.com/embed/'.$id.'?rel='.$rel.'" frameborder="0" allowfullscreen>'; } //return normal thumb else if($return == 'thumb'){ return 'http://i1.ytimg.com/vi/'.$id.'/default.jpg'; } //return hqthumb else if($return == 'hqthumb'){ return 'http://i1.ytimg.com/vi/'.$id.'/hqdefault.jpg'; } // else return id else{ return $id; } } ?>
I'm dealing with this too so if you find a better solution please let me know. It doesn't quite do what you need for images out of the box but it could be easily adapted.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With