2012-11-20 8 views
13

自分のアプリケーションのYouTube URLを検証しようとしています。Regexを使用してYouTube URLを検証する

// Set the youtube URL 
$youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk"; 

if (preg_match("/((http\:\/\/){0,}(www\.){0,}(youtube\.com){1} || (youtu\.be){1}(\/watch\?v\=[^\s]){1})/", $youtube_url) == 1) 
{ 
    echo "Valid"; 
else 
{ 
    echo "Invalid"; 
} 

が、私はYouTubeのURLの以下のバリエーションを検証したい:とHTTPのない

  • :付きとWWWなし//
  • は、これまでのところ、私は次のよう持っています。 URLをyoutube.comとyoutu.be

  • を持たなければならない/見る?V =

しかし( "vpfzjcCzdtCk" 上記の例では)独自のビデオ文字列を持っている必要があります、私と

  • 何らかの理由でそれがためにを返すので、私は私のロジックの権利を持っているとは思わない:www.youtube.co/watch?v=vpfzjcCzdtCk(私は.coない.comと間違って、それを書いた注意してください)

  • +0

    可能な重複[正規表現YouTubeのURL](HTTP:

    { A, Q, g, w } 

    これは私たちにchannelIdのための正規表現を与えます://stackoverflow.com/questions/8306963/regular-expression-youtube-url) –

    答えて

    31

    冗長性の多くは、あなた(とも、leaning toothpick syndrome)のこの正規表現ではあります。

    $rx = '~ 
        ^(?:https?://)?       # Optional protocol 
        (?:www[.])?        # Optional sub-domain 
        (?:youtube[.]com/watch[?]v=|youtu[.]be/) # Mandatory domain name (w/ query string in .com) 
        ([^&]{11})        # Video id of 11 characters as capture group 1 
        ~x'; 
    
    $has_match = preg_match($rx, $url, $matches); 
    
    // if matching succeeded, $matches[1] would contain the video ID 
    

    いくつかの注意:

    • チルダ文字~はLTS
    • を避けるためには視覚的な読みやすさを向上させ、LTSを避ける​​ために[.]の代わり\.を使用し、区切り文字として使用これは、しかし、結果を出す必要があります。
    • 正規表現をより「可読」にするには、x修飾子を使用できます(これはさらに意味があります; the docs on Pattern modifiersを参照してください)また、正規表現でのコメントも可能です。を使用してキャプチャを抑制することができます。
    • これにより、表現がより効率的になります。

    必要に応じて、(多かれ少なかれ完全な)URLから値を抽出するために、あなたはparse_url()を利用したい場合があります

    $url = 'http://youtube.com/watch?v=VIDEOID'; 
    $parts = parse_url($url); 
    print_r($parts); 
    

    出力:

    Array 
    (
        [scheme] => http 
        [host] => youtube.com 
        [path] => /watch 
        [query] => v=VIDEOID 
    ) 
    

    検証ドメイン名とビデオIDの抽出は、読者の練習として残されます。


    私は以下のコメント戦争に参加しました。 Toni Oriolのおかげで、正規表現は短い(youtu.be)URLでも動作するようになりました。

    +0

    うわー、それは素晴らしい答えです。なぜ私が働くのかを説明するためにマニュアルを見ていくことになると思うが、それは単に素晴らしいことだ!ありがとう! – Luke

    +0

    テキストボックスでyoutubeのリンクを検証する方法 - http://stackoverflow.com/questions/28735459/how-to-validate-you-tube-url-in-client-side-in-text-box – Hitesh

    +1

    は確認していません次のURL youtu.be/pmpqdwvzzzm – muaaz

    3

    を試してください:

    // Set the youtube URL 
    $youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk"; 
    
    if (preg_match("/^((http\:\/\/){0,}(www\.){0,}(youtube\.com){1}|(youtu\.be){1}(\/watch\?v\=[^\s]){1})$/", $youtube_url) == 1) 
    { 
        echo "Valid"; 
    } 
    else 
    { 
        echo "Invalid"; 
    } 
    

    いずれにしても^ $なしでOKです。

    3

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

    $valid = preg_match("/^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/watch\?v\=\w+$/", $youtube_url); 
    if ($valid) { 
        echo "Valid"; 
    } else { 
        echo "Invalid"; 
    } 
    
    +1

    これはハイフン付きの動画IDは受け入れません – aphoe

    5

    正規表現の代わりにparse_url()があります。

    コードはより多くありますが、読みやすく、保守性が高いです。

    1

    私はURLの構文を解析するために、このページの他の回答に延期するが、私はStackExchange/webappsの上、下記の回答で説明するように値自体YouTubeのIDのために、あなたは、もう少し具体的にすることができます

    Format for ID of YouTube videoからhttps://webapps.stackexchange.com/a/101153/141734


    ビデオ同上

    videoIdの場合、これは8バイト(64ビット)の整数です。 8バイトのデータにBase64エンコーディングを適用するには、の11文字のが必要です。しかし、各Base64文字は正確に6ビットを伝送するので、この割り当ては実際には11 × 6 = 66ビットを保持することができます。これは、ペイロードに必要なビット数を2ビット余分に消費します。余分なビットはゼロに設定され、エンコードされた文字列の最後の位置に現れる特定の文字を除外する効果があります。

    [-_A-Za-z0-9]{10}[AEIMQUYcgkosw048] 
    

    チャネルを次のようにこのように、VIDEOIDの正規表現(正規表現)であろう

    { A, E, I, M, Q, U, Y, c, g, k, o, s, w, 0, 4, 8 } 
    

    :特に、VIDEOIDは常に次のいずれかで終了しますまたはプレイリストID

    channelIdおよびplaylistId文字列は、128ビット(16バイト)のバイナリ整数をBase64でエンコードすることによって生成されます。ここでも、Base64ごとの計算では、観測された文字列の長さは、の22文字のと正しく予測されます。この場合、出力は22 × 6 = 132ビット、4ビットの余剰を符号化することができます。それらのゼロは、最後の位置に現れることから64文字のアルファベット記号の大部分を制限し、残りの4文字は適格なままです。すべての文字列は、次のいずれかで終わるchannelId:

    [-_A-Za-z0-9]{21}[AQgw] 
    
    +0

    この追加情報をお寄せいただきありがとうございましたGlenn!したがって、より具体的なresexのバージョンはhttps://regex101.com/r/pveXvY/1になります – Luke

    関連する問題