1

私はプロジェクトに取り組んでいますが、解決できないことがあります。

ユーザーは、YouTube クリップのリンクをフォーム EG に追加するだけで、YouTube ビデオをプロファイルに追加できます。

ユーチューブのリンク:youtube.com/watch?v=9YgjZ4oPrj4

ユーザーが送信をクリックしたら、ビデオを埋め込む必要があります。唯一の問題は、9YgjZ4oPrj4埋め込みにこの部分しか必要ないことです (以下のコードを参照)。

<iframe width="560" height="315" src="http://www.youtube.com/embed/9YgjZ4oPrj4" frameborder="0" allowfullscreen></iframe>

ご存知のように、YouTube 動画にはさまざまな種類のリンクがあります。

youtube.com/watch?v=9YgjZ4oPrj4
youtu.be/9YgjZ4oPrj4

これを機能させるにはどうすればよいですか?実際にはFacebookが使用するものと同じです

4

2 に答える 2

2

文字列から YouTube ID を取得するコードを次に示します。Forrstからコピーしただけですが、必要なことが行われるはずです。

function youtube_id($url){
  $url = preg_replace('((http://)?(www\.)?(youtube\.com|youtu\.be)(/v/|/watch\?v=|/)([a-zA-Z0-9_-]*)(.*))',"$5",$url);
  return (preg_match('(([a-zA-Z0-9_-]*){11,18})',$url) ? $url : '');
}

次の URL がテストされました。

"http://www.youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"www.youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"http://www.youtube.com/v/pkPgYbdQ1kQ&feature=feedu"
"www.youtube.com/v/pkPgYbdQ1kQ&feature=feedu"
"http://youtu.be/pkPgYbdQ1kQ"
"youtu.be/pkPgYbdQ1kQ"
于 2012-11-24T15:11:23.940 に答える
1

ホスト名とクロージャーのマップを作成できます。

$tubes = array(
  'youtube.com' => function($parsed_url) {
    //$parsed_url contains data as returned by parse_url()
  },
  'youtu.be' => function($parsed_url) {
    //
  },
);

次に、コンテンツを正規表現で解析し、URL を取得して、マップ内の適切な要素への呼び出しを介して渡します。

この方法はより汎用性が高く、YouTube に限定されないため、vimeo を含む任意のホストのヘルパーを簡単に追加でき、必要に応じて何を知っているかがわかります。

サンプルの実用的な実装、残りはあなたに任せます:

<?php
$text = 'http://youtube.com/watch?v=9YgjZ4oPrj4

http://youtu.be/9YgjZ4oPrj4';

$tubes = array(
    'youtube.com' => function($parse_url) {
        parse_str($parse_url['query'], $query);
        return "<iframe width='560' height='315' src='http://www.youtube.com/embed/$query[v]' frameborder='0' allowfullscreen></iframe>";
    },
);

$replace = function($matches) use ($tubes) {
    $url = parse_url($matches[0]);
    if(isset($tubes[$url['host']])) {
        return $tubes[$url['host']]($url);
    }
    return $matches[0];
};

$matches = preg_replace_callback('/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/', $replace, $text);

var_dump($matches);

新しいヒューリスティックが必要な場合は、$tubesマップに追加するだけです。

于 2012-11-24T15:01:38.283 に答える