Validating Youtube URL using Regex

php, regex, youtube

Solution

There are a lot of redundancies in this regular expression of yours (and also, the leaning toothpick syndrome). This, though, should produce results:

$rx = '~
  ^(?:https?://)?                           # Optional protocol
   (?:www[.])?                              # Optional sub-domain
   (?:youtube[.]com/watch[?]v=|youtu[.]be/) # Mandatory domain name (w/ query string in .com)
   ([^&]{11})                               # Video id of 11 characters as capture group 1
    ~x';

$has_match = preg_match($rx, $url, $matches);

// if matching succeeded, $matches[1] would contain the video ID

Some notes:

- use the tilde character `~` as delimiter, to avoid LTS

- use `[.]` instead of `\.` to improve visual legibility and avoid LTS. ("Special" characters - such as the dot `.` - have no effect in character classes (within square brackets))

- to make regular expressions more "readable" you can use the `x` modifier (which has further implications; see the docs on Pattern modifiers), which also allows for comments in regular expressions

- capturing can be suppressed using non-capturing groups: `(?: <pattern> )`. This makes the expression more efficient.

Optionally, to extract values from a (more or less complete) URL, you might want to make use of `parse_url()`:

$url = 'http://youtube.com/watch?v=VIDEOID';
$parts = parse_url($url);
print_r($parts);

Output:

Array
(
    [scheme] => http
    [host] => youtube.com
    [path] => /watch
    [query] => v=VIDEOID
)

Validating the domain name and extracting the video ID is left as an exercise to the reader.

I gave in to the comment war below; thanks to Toni Oriol, the regular expression now works on short (youtu.be) URLs as well.

Problem

I'm trying to validate YouTube URLs for my application. So far I have the following: ``` // Set the youtube URL $youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk"; if (preg_match("/((http\:\/\/){0,}(www\.){0,}(youtube\.com){1} || (youtu\.be){1}(\/watch\?v\=[^\s]){1})/", $youtube_url) == 1) { echo "Valid"; else { echo "Invalid"; } ``` I wish to validate the following variations of Youtube Urls: - With and without http:// - With and without www. - With the URLs youtube.com and youtu.be - Must have /watch?v= - Must have the unique video string (In the example above "vpfzjcCzdtCk") However, I don't think I've got my logic right, because for some reason it returns true for: `www.youtube.co/watch?v=vpfzjcCzdtCk` (Notice I've written it incorrectly with `.co` and not `.com`)

Original source

Related problems