PHP RegexはYouTubeビデオIDを取得しますか?


137

他のGET変数がURLにあるかどうかに関係なく、誰かがYouTube IDをURLから取得する方法を教えてもらえますか?

たとえば、このビデオを使用します。http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
つまりv=、次の間&


1
それは役に立つかもしれません stackoverflow.com/questions/9522868/...

1
私のコードgithub.com/lingtalfi/video-ids-and-thumbnails/blob/master/…をご覧ください。YouTube、vimeo、dailymotionからIDを抽出する関数を提供しています。
2015

@ling in function getVideoThumbnailByUrl()あなたはVimeoで非推奨のfile_get_contents()を使用していました。この交換はどこでも動作します:$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $hash =unserialize(curl_exec($ch)); curl_close($ch);
jerrygarciuh

@lingまた、getYoutubeId($ url)では、最終的な条件は任意の文字列を受け入れ、それをYT IDとして検証します。私はそれを「ジャンク」に渡し、その文字列から解析されたIDとしてジャンクを返しました。
jerrygarciuh 2015年

@jerrygarciuh:afaik file_get_contentsは非推奨ではありません。この関数に問題があった場合は、githubに問題を報告してください。getYoutubeIdでエラーを発見していただきありがとうございます(拡張しました)。
リン

回答:


304

parse_url()およびparse_str()を使用します。

(正規表現はほぼすべての目的で使用できますが、エラーが発生しやすいので、達成しようとしていることに特化したPHP関数がある場合は、それらを使用してください。)

parse_urlは文字列を受け取り、それを一連の情報を持つ配列に分割します。この配列を操作するか、必要な項目を2番目の引数として指定できます。この場合は、クエリであるに興味がありますPHP_URL_QUERY

これでクエリはになりますがv=C4kxS1ksqtw&feature=relate、必要なのはの後の部分だけですv=。これについては、parse_str基本的GETには文字列のように機能するものに注目します。文字列を受け取り、文字列で指定された変数を作成します。この場合$v$feature作成されます。興味があるのはだけです$v

安全のためparse_urlに、名前空間にからのすべての変数を格納するだけでは不十分です(mellowsoonのコメントを参照)。代わりに、変数を配列の要素として格納します。これにより、格納する変数を制御でき、既存の変数を誤って上書きすることはありません。

すべてをまとめると、次のようになります。

<?php
$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate";
parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
echo $my_array_of_vars['v'];    
  // Output: C4kxS1ksqtw
?> 

実施例


編集:

hehe-Charlesに感謝します。それは私を笑わせました、私はザウィンスキーの引用を見たことがありません:

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems.ジェイミー・ザウィンスキー


1
それは正規表現を使用しませんが(少なくとも目に見える-私は内部でどのようにparse_url()機能するのかわかりません)、これは行く方法です。
Thomas Owens、

11
<ザウィンスキーの見積もりをここに挿入>。真剣に取り組んでいますが、タスクを実行するために言語関数を使用することは、優れた正規表現が必要とするフープジャンプよりも優れていることがよくあります。
チャールズ

1
parse_str()の2番目のパラメーターを使用して、クエリのパラメーターを配列に格納することのみをお勧めします。変数が魔法のように薄い空気の外に現れることは決して良い考えではありません。
mellowsoon

2
parse_strを使用した理由の簡単な簡単な例()の"魔法の変数は、「良いアイデアではありません- > pastebin.com/AtaaPH4r
mellowsoon

1
@Qualcuno-もちろん違います。これは特に、OPごとに「変数の取得」を取得するためのものです。あなたの例は変数を取得していません。
Peter Ajtai 2012

154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

これは

youtube.com/v/{vidid}
youtube.com/vi/{vidid}
youtube.com/?v={vidid}
youtube.com/?vi={vidid}
youtube.com/watch?v={vidid}
youtube.com/watch?vi={vidid}
youtu.be/{vidid}

サポートするために少し改善しました:http : //www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

現在使用している行は次のとおりです。

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);

3
次のようなURLも処理するように更新しました:youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs

11
これは、埋め込み文字列(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob

3
これは/(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& "' >] +)/
bokor

2
実際、@ bokorのコード$matchesは、プロジェクトに非常に役立つビデオIDを含む詳細情報を配列に追加します
cronoklee

2
ロブの正規表現に加えて、&listもキャプチャされました。これは以下の正規表現で取り除かれます:#(?<=(?: v | i)=)[a-zA-Z0-9 -_] + |(?<=(?: v | i)\ /) [^&?\ n] + |(?<= embed \ /)[^ "&?\ n] + |(?<= ‌(?:v | i)=)[^&?\ n] + |(?<= youtu.be \ /)[?^&\ n]は+#今サポート:youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/... _AEyFjTvgtx //www.youtube.com/embed/ RRyG_mtYieI?list = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf 14

100

アンソニーの答えに関するボコールのコメントに基づく:

preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);

$matches[1] vididが含まれています

一致:

一致していません:

  • www.facebook.com?wtv=youtube.com/v/vidid

この文字列のC / objc / c ++バージョンはありますか?脱出するパーツがわかりません。
ジョアン・ヌネス

試してみました: "^(?:http(?:s)?://)?(?:www \\。)?(?:youtu \\。be / | youtube \\。com /(?:(? :watch)?\?(?:。*&)?v(?:i)?= |(?:embed | v | vi | user)/))([^ \?&\ "'>] +) 「すべてのあなたの例を通らない
ジョアン・ヌネス

1
問題が見つかりました。ここに最終的なc文字列があります: "^(?:http(?:s)?://)?(?:www \\。)?(?:youtu \\。be / | youtube \\。com / (?:( ?: watch)?\\?(?:。*&)?v(?:i)?= |(?:embed | v | vi | user)/))([^ \?&\ "'>] +)"
ジョアン・ヌネス

また、同様に、アカウントのURLに撮るにはyoutube.com/watch?v=vidid#action=share私が追加した#終了キャプチャグループに:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell

1
スペースを含むコンテンツを追加し、ページ上のURLの後にすべてのテキストを取得します。/(?: http(?:s)?:\ / \ /)?(?: www \。)?(?: m \。)?(?: youtu \ .be \ / | youtube \。 com \ /(?:( ?: watch)?\?(?:。*&)?v(?:i)?= |(?:embed | v | vi | user)\ /))([a- zA-Z0-9 \ -_] *)/
Gino

36

これは、parse_strおよびparse_urlを使用して非常に簡単に実行できます。でき、私の意見ではより信頼できます。

私の関数は次のURLをサポートしています。

関数の下にテストも含まれます。

/**
 * Get Youtube video ID from URL
 *
 * @param string $url
 * @return mixed Youtube video ID or FALSE if not found
 */
function getYoutubeIdFromUrl($url) {
    $parts = parse_url($url);
    if(isset($parts['query'])){
        parse_str($parts['query'], $qs);
        if(isset($qs['v'])){
            return $qs['v'];
        }else if(isset($qs['vi'])){
            return $qs['vi'];
        }
    }
    if(isset($parts['path'])){
        $path = explode('/', trim($parts['path'], '/'));
        return $path[count($path)-1];
    }
    return false;
}
// Test
$urls = array(
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
);
foreach($urls as $url){
    echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n";
}

これは本当に素晴らしいもので、実際にはvimeoビデオでも機能します
Chris James Champeau

1
これも私の好ましい答えです。YouTubeとVimeoの両方をカバーしています。1つのメモ、isset()を追加したスーパーマイナーツイークを追加しました。それ以外の場合はif(isset($ qs ['vi']))です。これに感謝します。
スペドリー2014

23

あらゆる種類のリンクに対応

<?php
function get_youtube_id_from_url($url)  {
     preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results);    return $results[6];
}


echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla');
      // or                   http://youtu.be/GvJehZx3eQ1 
      // or                   http://www.youtube.com/embed/GvJehZx3eQ1
      // or                   http://www.youtu.be/GvJehZx3eQ1/blabla?xyz
?>

出力: GvJehZx3eQ1


13

YouTubeビデオIDを検証する方法に基づいて修正されましたか?

<?php

$links = [
    "youtube.com/v/tFad5gHoBjY",
    "youtube.com/vi/tFad5gHoBjY",
    "youtube.com/?v=tFad5gHoBjY",
    "youtube.com/?vi=tFad5gHoBjY",
    "youtube.com/watch?v=tFad5gHoBjY",
    "youtube.com/watch?vi=tFad5gHoBjY",
    "youtu.be/tFad5gHoBjY",
    "http://youtu.be/qokEYBNWA_0?t=30m26s",
    "youtube.com/v/vidid",
    "youtube.com/vi/vidid",
    "youtube.com/?v=vidid",
    "youtube.com/?vi=vidid",
    "youtube.com/watch?v=vidid",
    "youtube.com/watch?vi=vidid",
    "youtu.be/vidid",
    "youtube.com/embed/vidid",
    "http://youtube.com/v/vidid",
    "http://www.youtube.com/v/vidid",
    "https://www.youtube.com/v/vidid",
    "youtube.com/watch?v=vidid&wtv=wtv",
    "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related",
    "youtube.com/watch?v=7HCZvhRAk-M"
];

foreach($links as $link){
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)([a-zA-Z0-9_-]+)#", $link, $matches);
    var_dump(end($matches));
}

9

私たちは、ビデオIDが11文字の長さであることを知っているし、が先行することができv=たりvi=またはv/またはvi/またはyoutu.be/。これを行う最も簡単な方法は次のとおりです。

<?php
$youtube = 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player';

preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches);

var_dump($matches[0]);

そして出力:

array(8) {
  [0]=>
  string(11) "dQw4w9WgXcQ"
  [1]=>
  string(11) "dQw4w9WgXcQ"
  [2]=>
  string(11) "dQw4w9WgXcQ"
  [3]=>
  string(11) "dQw4w9WgXcQ"
  [4]=>
  string(11) "dQw4w9WgXcQ"
  [5]=>
  string(11) "dQw4w9WgXcQ"
  [6]=>
  string(11) "dQw4w9WgXcQ"
  [7]=>
  string(11) "dQw4w9WgXcQ"
}

9

以下はすべてのYouTubeリンクで機能します

<?php
    // Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
    // http://youtu.be/dQw4w9WgXcQ
    // http://www.youtube.com/embed/dQw4w9WgXcQ
    // http://www.youtube.com/watch?v=dQw4w9WgXcQ
    // http://www.youtube.com/?v=dQw4w9WgXcQ
    // http://www.youtube.com/v/dQw4w9WgXcQ
    // http://www.youtube.com/e/dQw4w9WgXcQ
    // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
    // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
    // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
    // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
    // It also works on the youtube-nocookie.com URL with the same above options.
    // It will also pull the ID from the URL in an embed code (both iframe and object tags)

$url = "https://www.youtube.com/watch?v=v2_MLFVdlQM";

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

    $youtube_id = $match[1];

echo $youtube_id;
    ?>

4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];

おかげで、すべてのドメイン、httpとhttps、およびURLにある他のあらゆるがらくたが必要だったので、これは私にとってはうまくいきました。
MakuraYami

4
(?<=\?v=)([a-zA-Z0-9_-]){11}

これもそれを行う必要があります。


4

Youtube IDを取得するために暗号化しなければならない投稿コンテンツがありました。たまたま、<iframe>YouTubeが提供する埋め込みコードの形式になっています。

 <iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe>

上記の@robから取得した次のパターン。foreach一致が見つかると、スニペットはループします。追加のボーナスとして、YouTubeで見つかったプレビュー画像にリンクを追加しました。Youtube埋め込みタイプとURLのより多くのタイプと一致する可能性があります。

$pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#';

preg_match_all($pattern, $post_content, $matches);

foreach ($matches as $match) {
    $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />";
    break;
}

Robのプロファイル:https : //stackoverflow.com/users/149615/rob


4

idキャプチャグループ内でを抽出する場合、次の式またはその派生物もオプションになる可能性があります。

(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)

デモ

テスト

$re = '/(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)/';
$str = 'http://youtube.com/v/tFad5gHoBjY
https://youtube.com/vi/tFad5gHoBjY
http://www.youtube.com/?v=tFad5gHoBjY
http://www.youtube.com/?vi=tFad5gHoBjY
https://www.youtube.com/watch?v=tFad5gHoBjY
youtube.com/watch?vi=tFad5gHoBjY
youtu.be/tFad5gHoBjY
http://youtu.be/qokEYBNWA_0?t=30m26s
youtube.com/v/7HCZvhRAk-M
youtube.com/vi/7HCZvhRAk-M
youtube.com/?v=7HCZvhRAk-M
youtube.com/?vi=7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M
youtube.com/watch?vi=7HCZvhRAk-M
youtu.be/7HCZvhRAk-M
youtube.com/embed/7HCZvhRAk-M
http://youtube.com/v/7HCZvhRAk-M
http://www.youtube.com/v/7HCZvhRAk-M
https://www.youtube.com/v/7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M&wtv=wtv
http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M&feature=related
youtube.com/watch?v=7HCZvhRAk-M
http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

出力

array(30) {
  [0]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [1]=>
  array(2) {
    [0]=>
    string(34) "https://youtube.com/vi/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [2]=>
  array(2) {
    [0]=>
    string(37) "http://www.youtube.com/?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [3]=>
  array(2) {
    [0]=>
    string(38) "http://www.youtube.com/?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [4]=>
  array(2) {
    [0]=>
    string(43) "https://www.youtube.com/watch?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [5]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [6]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [7]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/qokEYBNWA_0"
    [1]=>
    string(11) "qokEYBNWA_0"
  }
  [8]=>
  array(2) {
    [0]=>
    string(25) "youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [9]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/vi/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [10]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [11]=>
  array(2) {
    [0]=>
    string(27) "youtube.com/?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [12]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [13]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [14]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [15]=>
  array(2) {
    [0]=>
    string(29) "youtube.com/embed/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [16]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [17]=>
  array(2) {
    [0]=>
    string(36) "http://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [18]=>
  array(2) {
    [0]=>
    string(37) "https://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [19]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [20]=>
  array(2) {
    [0]=>
    string(57) "http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [21]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [22]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [23]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/vi/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [24]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [25]=>
  array(2) {
    [0]=>
    string(42) "http://www.youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [26]=>
  array(2) {
    [0]=>
    string(34) "http://youtube.com/?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [27]=>
  array(2) {
    [0]=>
    string(38) "http://youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [28]=>
  array(2) {
    [0]=>
    string(39) "http://youtube.com/watch?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [29]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
}

式を簡略化/変更/探索する場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。


RegEx回路

jex.imは正規表現を視覚化します。

ここに画像の説明を入力してください



2
$vid = preg_replace('/^.*(\?|\&)v\=/', '', $url);  // Strip all meuk before and including '?v=' or '&v='.

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid);  // Strip trailing meuk.

2

スレッドのタイトルが正規表現の使用を指していることは知っていますが、ザウィンスキーの引用が言うように、ここでは正規表現を回避するのが最善だと私は本当に思います。代わりにこの関数をお勧めします:

function get_youtube_id($url)
{
    if (strpos( $url,"v=") !== false)
    {
        return substr($url, strpos($url, "v=") + 2, 11);
    }
    elseif(strpos( $url,"embed/") !== false)
    {
        return substr($url, strpos($url, "embed/") + 6, 11);
    }

}

YouTube動画のIDは常に同じであり、URLのスタイルとは無関係であるため、これをお勧めします。たとえば、

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `そして、「embed /」という単語がIDの前に配置される他のUlrフォーム... !!

そして、それは埋め込まれたものの場合かもしれませiframeん。


0

これをオンラインでhttp://snipplr.com/view/62238/get-youtube-video-id-very-robust/で見つけました

function getYouTubeId($url) {
// Format all domains to http://domain for easier URL parsing
str_replace('https://', 'http://', $url);
if (!stristr($url, 'http://') && (strlen($url) != 11)) {
    $url = 'http://' . $url;
}
$url = str_replace('http://www.', 'http://', $url);

if (strlen($url) == 11) {
    $code = $url;
} else if (preg_match('/http:\/\/youtu.be/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 1, 11);
} else if (preg_match('/watch/', $url)) {
    $arr = parse_url($url);
    parse_str($url);
    $code = isset($v) ? substr($v, 0, 11) : false;
} else if (preg_match('/http:\/\/youtube.com\/v/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 3, 11);
} else if (preg_match('/http:\/\/youtube.com\/embed/', $url, $matches)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 7, 11);
} else if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches) ) {
    $code = substr($matches[0], 0, 11);
} else {
    $code = false;
}

if ($code && (strlen($code) < 11)) {
    $code = false;
}

return $code;
}

0

Shawnの回答からのデータを使用しましたが、一般化して正規表現を少し短くしました。これとの主な違いは、有効なYouTube URLをテストせず、動画IDを探すだけです。つまり、の動画IDが返されwww.facebook.com?wtv=youtube.com/v/vididます。すべてのテストケースで機能しますが、少し緩めです。その結果、のようなものに対して誤検知が出力されますhttps://www.twitter.com/watch?v=vidid。データが非常に矛盾している場合は、この方法を使用します。それ以外の場合は、より具体的な正規表現またはparse_url()andを使用しますparse_str()

preg_match("/([\?&\/]vi?|embed|\.be)[\/=]([\w-]+)/",$url,$matches);
print($matches[2]);

0

あなたはこれをやろうとしていると思います。

<?php
  $video = 'https://www.youtube.com/watch?v=u00FY9vADfQ';
  $parsed_video = parse_url($video, PHP_URL_QUERY);
  parse_str($parsed_video, $arr);
?>
<iframe
src="https://www.youtube.com/embed/<?php echo $arr['v'];  ?>"
frameborder="0">
</iframe>

0

他の文字でいっぱいの文字列からyoutueのURLを抽出したい場合はどうなりますか?このような:

Lorem ipsum dolor sit amet、consectetur adipiscing ellit、sed do eiusmod tempor incididunt ut Laber et dolore magna aliqua。Ut enim ad minim veniam、quis nostrud exercitation ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 Laboris nisi ut aliquip ex ea commodo consequat。Duis aute irure dolor in reprehenderit in voluppate velit esse cillum dolore eu fugiat nulla pariatur。Excepteur sint occaecat cupidatat non proident、sunp in culpa qui officia deserunt mollit anim id est Laborum。

そして、その文字列からhttps://www.youtube.com/watch?v=cPW9Y94BJI0を取得しますか?


0

このコードを使用してください:

$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related"; 
$parse = parse_url($url, PHP_URL_QUERY); 
parse_str($parse, $output); 
echo $output['watch'];

結果: C4kxS1ksqtw

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.