1

通常の YouTube URL の YouTube ID を見つけるために、すでに機能しています。しかし、短い youtu.be URL については考えていませんでした。動画の YouTube ID を除外する方法がわかりません。私の知る限り、次の種類の YT-URL が利用可能です。

youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index

youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0

youtube.com/watch?v=0zM3nApSvMg#t=0m10s

youtube.com/embed/0zM3nApSvMg?rel=0

youtube.com/watch?v=0zM3nApSvMg

youtu.be/0zM3nApSvMg

別の質問でこれを見つけましたが、機能していません:

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/

私の質問は次のとおりです。次のコードを編集して、常に YouTube ID を取得するにはどうすればよいですか?! ;)

どうもありがとう!

add_filter('embed_oembed_html', 'my_embed_oembed_html', 99, 4);
function my_embed_oembed_html( $html, $url, $attr, $post_id) {
    $posttext = substr($url[0],1);  
    preg_match('/v\=([a-zA-Z0-9,-]+)/', $url, $youtubeID);   

  return '<div id="video" class="border-frame"><video class="video" data-settings="autoresize:fit" preload="none" data-youtube-id="' . $youtubeID[1] . '"></video></div>';
}
4

2 に答える 2

2

実際には、正規表現を使用しないことを検討するかもしれません。PHP には、役立つ組み込み関数がたくさんあります。たとえば、次のコードを試してください。

$urls = array(
    'youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
    'youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
    'youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0',
    'youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
    'youtube.com/embed/0zM3nApSvMg?rel=0',
    'youtube.com/watch?v=0zM3nApSvMg',
    'youtu.be/0zM3nApSvMg'
);

function displayId($url, $id) {
    echo "URL: ", $url, "\n";
    echo "ID:  ", $id, "\n\n";
}

foreach ($urls as $url) {

    $u = parse_url($url);

    parse_str($u['query'], $queryVars);

    if ($u['query'] && $queryVars['v']) {
        displayId($url, $queryVars['v']);
    } else if ($u['fragment']) {
        displayId($url, basename($u['fragment']));
    } else if ($u['path']) {
        displayId($url, basename($u['path']));
    }
}

これにより、次の出力が生成されます。

URL: youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
ID:  0zM3nApSvMg

URL: youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
ID:  QdK8U-VIH_o

URL: youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
ID:  0zM3nApSvMg

URL: youtube.com/watch?v=0zM3nApSvMg#t=0m10s
ID:  0zM3nApSvMg

URL: youtube.com/embed/0zM3nApSvMg?rel=0
ID:  0zM3nApSvMg

URL: youtube.com/watch?v=0zM3nApSvMg
ID:  0zM3nApSvMg

URL: youtu.be/0zM3nApSvMg
ID:  0zM3nApSvMg

コードはより堅牢になる可能性がありますが、アイデアが得られると思います。:)

乾杯。

于 2013-01-12T04:46:05.687 に答える
1
add_filter('embed_oembed_html', 'my_embed_oembed_html', 99, 4);
function my_embed_oembed_html( $html, $url, $attr, $post_id) {
    $posttext = substr($url[0],1); 
    preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $youtubeID);   

  return '<div id="video" class="border-frame"><video class="video" data-settings="autoresize:fit" preload="none" data-youtube-id="' . $youtubeID[1] . '"></video></div>';
}
于 2013-01-12T03:50:47.327 に答える