2

次のコードは、 を除くすべての YouTube ドメインで機能しますyoutu.be。例は次のようになりますhttp://www.youtube.com/watch?v=ZedLgAF9aEg:ZedLgAF9aEg

私の質問は、どうすれば で動作させることができるかということhttp://youtu.be/ZedLgAF9aEgです。私は正規表現が得意ではないので、あなたの助けに感謝します。私のコードは次のとおりです。

    $text = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $text)); }
$text = (htmlentities($text, ENT_QUOTES, 'UTF-8'));

再度、感謝します!

4

8 に答える 8

3
//$url = 'http://www.youtube.com/watch?v=ZedLgAF9aEg';
$url = 'http://youtu.be/ZedLgAF9aEg';

if (FALSE === strpos($url, 'youtu.be/')) {
    parse_str(parse_url($url, PHP_URL_QUERY), $id);
    $id = $id['v'];
} else {
    $id = basename($url);
}

echo $id; // ZedLgAF9aEg

URL の両方のバージョンで機能します。PHP には URL を解析する関数が組み込まれているため、これには正規表現を使用しないでください。

于 2013-03-05T08:15:15.667 に答える
2

あなたの正規表現は現在の問題を解決しているように見えますか? PHP では試していませんが、エディタでは問題なく動作するようです。

正規表現の最初の部分はhttp://(?:www\.)?youtu\.?be(?:\.com)?/一致http://youtu.be/し、2 番目の部分(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)は で終わります。これは、何も|)一致しないことを意味します (オプションにします)。つまり、ID のみを残して削除されます。http://youtu.be/

より直感的な書き方は、グループ化がオプションの場合は全体を作成することですが、私が知る限り、あなたの正規表現はすでにあなたの問題を解決しています:

 #http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=)?#i

注: 正規表現はwww.youtu.be.comドメインでも機能します。これは削除されますが、これを入力の検証に使用する場合は注意が必要です。

アップデート:

[youtube][/youtube]タグ内の URL のみを一致させたい場合は、 look aroundsを使用できます。次のようなもの:

(?<=\[youtube\])(?:http://(?:www\.)?youtu\.?be(?:\.com)?/(?:embed/|watch\?v=|\?v=|v/|e/|[^\[]+/|watch.*v=)?)(?=.+\[/youtube\])

.+先読みを有効な URL 文字のみに一致させるなどして、さらに絞り込むことができます。

于 2013-03-05T08:29:34.633 に答える
0

これを試してください、それがあなたに役立つことを願っています

function YouTubeUrl($url)
{
if($url!='')
{
    $newUrl='';
    $videoLink1=$url;
    $findKeyWord='youtu.be';
    $toBeReplaced='www.youtube.com';
    if(IsContain('watch?v=',$videoLink1))
    {
        $newUrl=tMakeUrl($videoLink1);
    }
    else if(IsContain($videoLink1, $findKeyWord))
    {
        $videoLinkArray=explode('/',$videoLink1);
        $Protocol='';
        if(IsContain('://',$videoLink1))
        {
            $protocolArray=explode('://',$videoLink1);
            $Protocol=$protocolArray[0];
        }

        $file=$videoLinkArray[count($videoLinkArray)-1];
        $newUrl='www.youtube.com/watch?v='.$file;
        if($Protocol!='')
            $newUrl.=$Protocol.$newUrl;
        else
            $newUrl=tMakeUrl($newUrl);
    }
    else
        $newUrl=tMakeUrl($videoLink1);
    return $newUrl;
}
return '';
}

function IsContain($string,$findKeyWord)
{
     if(strpos($string,$findKeyWord)!==false)
    return true;
     else
    return false;
}

function tMakeUrl($url)
{
$tSeven=substr($url,0,7);
$tEight=substr($url,0,8);
if($tSeven!="http://" && $tEight!="https://")
{
    $url="http://".$url;
}
return $url;
}
于 2013-03-05T08:13:51.840 に答える
0

YouTube URLのいずれにも以下の関数を使用できます

これがお役に立てば幸いです

関数 checkYoutubeId($id)

{

$youtube = " http://www.youtube.com/oembed?url= ". $id ."&format=json";

$curl = curl_init($youtube);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$return = curl_exec($curl);

curl_close($curl);

return json_decode($return, true);

}

この関数は、ID が YouTube ビデオ ID と一致する場合、YouTube ビデオの詳細を返します。

于 2013-07-30T06:21:49.247 に答える
-2

これを試して :

$string = explode("=","http://www.youtube.com/watch?v=ZedLgAF9aEg");
echo $string[1];

次のようになります。ZedLgAF9aEg

于 2013-03-05T08:15:59.917 に答える