web-dev-qa-db-ja.com

preg_matchを使用してyoutube動画IDを解析します

Preg_matchを使用してyoutube URLのビデオIDを解析しようとしています。このサイトで機能しているように見える正規表現を見つけました。

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

この写真に示すように:

alt text

私のPHPは次のとおりですが、動作しません(不明な修飾子 '['エラーが発生します)...

<?
 $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>";

?>

乾杯

62
J.C

この正規表現は、私が見つけることができるさまざまなURLのすべてからIDを取得します。一致しない場合は、URLにコメントを残してください。URLに一致するように正規表現を更新しようとします。

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

この正規表現が一致するURLのサンプルは次のとおりです(指定されたURLの後に無視されるコンテンツがさらにある場合があります)

上記と同じオプションを使用して、youtube-nocookie.com URLでも機能します。

また、埋め込みコードのURLからIDを取得します(iframeタグとオブジェクトタグの両方)

225
Benjam

より良い使用 parse_url および parse_str URLとクエリ文字列を解析するには:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);
11
Gumbo

私は数週間前に書いたPHPクラスでこれに対処しなければならなかったので、あらゆる種類の文字列に一致する正規表現になりました:URLスキームの有無、サブドメインの有無、youtube .com URL文字列、youtu.be URL文字列、すべての種類のパラメーターの並べ替えを処理します GitHubで を確認するか、以下のコードブロックをコピーして貼り付けます。

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

正規表現を説明するために、こぼれたバージョンがあります:

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

リーダーの回答から正規表現を完成させました。また、さまざまなURLのすべてからIDを取得しますが、より正確にはです。

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];
}

また、11文字を超える誤ったIDを正しく処理します。

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

5
Modder

つかいます

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

PHPエラーに直接対処する人は誰もいなかったので、説明しようと思います。

「不明な修飾子 '['」エラーの理由は、区切り文字で正規表現をラップするのを忘れたことです。 PHPは、英数字でも空白でもない限り、最初の文字を区切り文字として使用します。ASCII文字。したがって、正規表現では:

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

PHPは、あなたが(を開始区切り文字として意図していると考えています。次に、終了デリミタであると思われるもの、次の)を見つけ、それに続くものがパターン修飾子であると想定します。ただし、最初の)の次の文字である最初のパターン修飾子が[であることがわかります。 [は明らかに有効なパターン修飾子ではないため、エラーが発生します。

解決策は、正規表現を区切り文字で単純にラップし、正規表現内の区切り文字が文字通り一致することを確認することです。区切り文字として~を使用したいので、正規表現でリテラル~と一致させる必要はほとんどありません。

1
m4olivei

スラッシュ文字をエスケープするのを忘れました。だから、これは仕事をする必要があります:

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

BBcodeの解析開始パラメーター( https://developers.google.com/youtube/player_parameters#start

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

PHP正規表現:

'#\[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'

replace:

'<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
Fixer

以下のコードを使用

$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
diEcho

これは私のために働いた。

$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
T.Todua