私はこの問題をほぼ5時間調査しましたが、私が思いつくことができる最善の方法は、Stackoverflowの投稿からの次のコードです。
<?php
$pattren = '%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/]{11})%i';
?>
私が達成したいのは、他の誰かが書いたカスタムメイドのWebフォーラムがあること、フォーラムのトピックでYouTubeビデオを直接視聴する機能を追加したいこと、さまざまなコードとパターンを試したことです。この投稿では、ほとんどすべてのYouTubeリンクに一致しますが、このコードでは克服できない問題が1つあります。フォーラムで使用されているBBCodeタグは[yt]youtubelink[/yt]
、パターンの前に
<?php
$pattren = '%\[yt\](?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/]{11})[\/yt]%i';
?>
しかし、それは機能しません。パターンに問題があることを示すエラーはまったく報告されません。
私が使用した完全なコード
<?php
$testmessage = "test youtube links [yt]http://www.youtube.com/watch?v=ZCLAwp2HbW4&feature=player_embedded[/yt] more text";
$pattren1 = '%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i';
$pattren2 = '%\[yt\](?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})[\/yt]%i';
echo '<h1>works:-</h1>';
echo preg_replace($pattren1, '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $testmessage);
echo '<h1>doesnt work:-</h1>';
echo preg_replace($pattren2, '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $testmessage);
?>
また、最初のパターンは部分的に機能しますが、たとえば最初のパターンは機能し、ビデオIDを取得している間、URLクエリ文字列を残します。この部分はテキストメッセージに残ります。&feature=player_embedded
アップデート:
まっすぐにpreg_replaceで動作させることができなかったので、この問題を修正する別の方法を考え出しました。コードを投稿します。誰かが6時間の人生を無駄にしないようにするために役立つかもしれません。この問題も!
<?php
$test = "test youtube links [yt]http://www.youtube.com/watch?v=ZCLAwp2HbW4&feature=player_embedded[/yt] more text";
echo preg_replace_callback('#\[yt\](.*)\[/yt\]#i', function ($matches) {
$regex = '#(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})#i';
preg_match($regex, $matches[1], $found);
if ($found[1])
return '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/'.$found[1].'" frameborder="0" allowfullscreen></iframe>';
}, $test);
?>
このコードはPHP5.3で機能し、<PHP5.3で無名関数を別の関数に移動します。