parse YouTube video id using preg match

Próbuję przeanalizować identyfikator wideo URL youtube za pomocą preg_match. Znalazłem na tej stronie Wyrażenie regularne, które wydaje się działać;

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+

Jak pokazano na tym zdjęciu:

alt text

Mój PHP jest następujący, ale nie działa(daje Nieznany błąd modyfikatora' [')...

<?
 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

 print "<pre>";
 print_r($matches);
 print "</pre>";

?>

Cheers

Author: hakre, 2010-05-30

10 answers

Ten regex pobiera identyfikator ze wszystkich różnych adresów URL, które udało mi się znaleźć... Może jest ich więcej, ale nigdzie nie mogłem znaleźć ich odniesienia. Jeśli natkniesz się na jeden, który nie pasuje, zostaw komentarz z adresem URL, a ja spróbuję zaktualizować wyrażenia regularne, aby pasowały do twojego adresu URL.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
    $video_id = $match[1];
}

Oto przykładowy adres URL, który pasuje do tego wyrażenia regularnego: (po podanym adresie URL może być więcej treści, które będą ignorowane)

Działa również na youtube-nocookie.com URL z tymi samymi powyższymi opcjami.

Dzięki temu możliwe jest również pobranie identyfikatora z adresu URL w kodzie osadzania (zarówno znaczniki iframe, jak i object)
 217
Author: Benjam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 08:47:20

Lepsze wykorzystanie parse_url oraz parse_str aby przeanalizować adres URL i ciąg zapytania:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);
 10
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 20:21:26

Miałem do czynienia z tym dla klasy PHP, które napisałem kilka tygodni temu i skończyło się z regex, który pasuje do każdego rodzaju ciągów: z schematem URL lub bez, z subdomeną lub bez, youtube.com ciągi URL, youtu.be ciągi URL i zajmująca się wszelkiego rodzaju sortowaniem parametrów. Możesz to sprawdzić na GitHub lub po prostu skopiować i wkleić poniższy blok kodu:

/**
 *  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;
}

Aby wyjaśnić regex, oto rozlana wersja:

/**
 *  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;
}
 7
Author: eyecatchUp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-10 04:40:14

Udoskonaliłem regex z odpowiedzi lidera . Pobiera również ID ze wszystkich różnych adresów URL, ale bardziej poprawnie .

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
    $video_id = $match[1];
}

Również poprawnie obsługuje błędne identyfikatory, które mają więcej niż 11 znaków.

http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF

 4
Author: Modder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-28 17:40:42

Użyj

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
 2
Author: Dogbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 20:22:10

Zapomniałeś uciec od postaci slash. Więc ten powinien wykonać zadanie:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]\/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
 1
Author: Novan Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 07:56:30

Parse start parametr dla BBcode ( https://developers.google.com/youtube/player_parameters#start )

Przykład: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]

PHP regex:

'#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim'

Zastąp:

'<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'
 1
Author: Fixer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 06:49:07

Nie widziałem nikogo bezpośrednio adres błędu PHP, więc postaram się wyjaśnić.

Przyczyną błędu "nieznany modyfikator" ["jest to, że zapomniałeś zawinąć Wyrażenie regularne w ograniczniki. PHP pobiera pierwszy znak jako ogranicznik, o ile jest to nie-alfanumeryczny, Nie-biały znak ASCII. Więc w regex:

preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

PHP myśli, że miałeś na myśli ( jako ogranicznik otwarcia. Następnie Znajduje to, co uważa za zamykający ogranicznik, następny ) i zakłada, co poniżej przedstawiono modyfikatory wzorców. Okazuje się jednak, że pierwszym modyfikatorem wzorca, kolejnym znakiem po pierwszym ), jest [. [ oczywiście nie jest poprawnym modyfikatorem wzorca, dlatego dostajesz błąd, który robisz.

Rozwiązaniem jest po prostu owinąć swoje wyrażenia regularne w ograniczniki i upewnić się, że wszystkie ograniczniki wewnątrz wyrażeń regularnych, które chcesz dopasować dosłownie są unikalne. Lubię używać ~ jako ograniczników, B / C rzadko trzeba dopasować literał ~ w regex.

 1
Author: m4olivei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 01:25:42

Użyj poniższego kodu

$url = "" // here is url of youtube video
$pattern = getPatternFromUrl($url); //this will retun video id

function getPatternFromUrl($url)
{
$url = $url.'&';
$pattern = '/v=(.+?)&+/';
preg_match($pattern, $url, $matches);
//echo $matches[1]; die;
return ($matches[1]);
}
 0
Author: diEcho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 21:06:13

To mi pomogło.

$yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla';

$videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url));
 0
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 21:38:29