This seems to work:
Code:
<?php
$pat = '@^http://[\w.]+youtube\.[\w]+/watch[\?\#!]+v=([\w-]+)[\w&;+=-]*[\#t=]*([\d]*)[&;10shdq=]*|^$@';
$strs = array('http://www.youtube.com/watch?v=is_b1ahWN3Q',
'http://www.youtube.com/watch?&v=is_b1ahWN3Q',
'http://www.youtube.com/watch#!v=is_b1ahWN3Q',
'http://www.youtube.com/watch?v=is_b1ahWN3Q&some_string=also_with_special_characters_&;+=-',
'http://www.youtube.com/watch?v=is_b1ahWN3Q#t=5m',
'http://www.youtube.com/watch?v=is_b1ahWN3Q#t=5m7s',
'http://www.youtube.com/watch?v=is_b1ahWN3Q#t=120s',
);
foreach ($strs as $str)
{
preg_match($pat, $str, $matches);
print_r($matches);
echo("<BR /><BR />\n");
}
?>
and I get this output:
Code:
Array ( [0] => http://www.youtube.com/watch?v=is_b1ahWN3Q [1] => is_b1ahWN3Q [2] => )
Array ( )
Array ( [0] => http://www.youtube.com/watch#!v=is_b1ahWN3Q [1] => is_b1ahWN3Q [2] => )
Array ( [0] => http://www.youtube.com/watch?v=is_b1ahWN3Q&some_string=also_with_special_characters_&;+=- [1] => is_b1ahWN3Q [2] => )
Array ( [0] => http://www.youtube.com/watch?v=is_b1ahWN3Q#t=5 [1] => is_b1ahWN3Q [2] => 5 )
Array ( [0] => http://www.youtube.com/watch?v=is_b1ahWN3Q#t=5 [1] => is_b1ahWN3Q [2] => 5 )
Array ( [0] => http://www.youtube.com/watch?v=is_b1ahWN3Q#t=120s [1] => is_b1ahWN3Q [2] => 120 )
It seems the second string doesn't match because the pattern doesn't allow for & where it appears in that string.