web-dev-qa-db-ja.com

YouTubeリンクの正規表現

誰かが、Youtubeへのリンクの可能なほとんどすべての方法から(埋め込みオブジェクトではなく)Youtubeビデオへのリンクを取得する正規表現を持っていますか?

これはかなり一般的な問題だと思います。それにリンクする方法はたくさんあると思います。

開始点は次のようになります。

34
jrom

これまでのところ、これを得たRegular expression私が投稿した例で機能し、最初のグループのIDを取得します。

http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?
55
jrom

以下の式を使用できます。

(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)\&?

私はそれを使っており、最もよく使われるURLをカバーしています。私はそれを更新し続けます この要点 。これでテストできます tool

13
brunodles

IRCでhttpがまったくないリンクでも認識できるように、上記で投稿したリンクを友人とスクリプトで改善しました。これは、文字化けしたテキストなど、これまでに取得したすべてのストレステストで機能しました。認識可能なyoutubeのurlなので、ここにあります:

~(?:https?://)?(?:www\.)?youtu(?:be\.com/watch\?(?:.*?&(?:amp;)?)?v=|\.be/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?~
5
Sata

Fanmade で裏打ちされたPiggyは、attribution_linksのURLエンコードバージョンを含む以下のリンクをカバーしています。

(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/|watch\%3Fv\%3D)([a-zA-Z0-9_-]{11})+



https://www.youtube.com/attribution_link?a=tolCzpA7CrY&u=%2Fwatch%3Fv%3DMoBL33GT9S8%26feature%3Dshare
https://www.youtube.com/watch?v=MoBL33GT9S8&feature=share
http://www.youtube.com/watch?v=iwGFalTRHDA 
https://www.youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related 
http://youtu.be/iwGFalTRHDA 
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA 
www.youtu.be/iwGFalTRHDA 
youtu.be/iwGFalTRHDA 
youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related 
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ
3
ProGirlXOXO

ここに示されているすべての正規表現をテストしましたが、クライアントが使用していたすべてのURLタイプをカバーできるものはありませんでした。

私はこれを試行錯誤してかなり構築しましたが、Poppy Deejayが投稿したすべてのパターンで動作するようです。

"(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/)([a-zA-Z0-9_-]{11})+"

多分それは私が今日持っていたのと同じような状況にいる誰かを助ける;)

3
Fanmade

最近atttribution_linkのURLで問題が発生しているので、それらでも機能する独自の正規表現を作成してみました。

これが私の正規表現文字列です:

(https?://)?(www\\.)?(yotu\\.be/|youtube\\.com/)?((.+/)?(watch(\\?v=|.+&v=))?(v=)?)([\\w_-]{11})(&.+)?

そしてここに私が試したいくつかのテストケースがあります:

http://www.youtube.com/watch?v=iwGFalTRHDA 
https://www.youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related 
http://youtu.be/iwGFalTRHDA 
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA 
www.youtu.be/iwGFalTRHDA 
youtu.be/iwGFalTRHDA 
youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related 
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ

また、動画のURLで取得した文字列を確認することを忘れないでください。場合によっては、パーセント文字が取得されることがあります。もしそうなら、これをしてください

url = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

そしてそれはそれを修正する必要があります。

また、youtubeキーのインデックスがインデックス9になっていることも覚えておいてください。

NSRange youtubeKey = [result rangeAtIndex:9]; //the youtube key
NSString * strKey = [url substringWithRange:youtubeKey] ;
2
Poppy Deejay

すべてのリンクフォーマットをカバーできれば、世界で最長のRegExになりますが、最初の2つのリンクフォーマットをカバーする方法を以下に示します。

http://(www\.)?youtube\.com/watch\?.*v=([a-zA-Z0-9]+).*

2番目のグループは、それを取得する必要がある場合にビデオIDと一致します。

1
TimS

私はそのようなリンクを扱っています:

http://www.youtube.com/v/M-faNJWc9T0?fs=1&rel=

そして、IDを取得するために使用しているregExは次のとおりです。

"(.+?)(\/v/)([a-zA-Z0-9_-]{11})+"
0
Samuel
(?:http?s?:\/\/)?(?:www.)?(?:m.)?(?:music.)?youtu(?:\.?be)(?:\.com)?(?:(?:\w*.?:\/\/)?\w*.?\w*-?.?\w*\/(?:embed|e|v|watch|.*\/)?\??(?:feature=\w*\.?\w*)?&?(?:v=)?\/?)([\w\d_-]{11})(?:\S+)?

https://regex101.com/r/nJzgG0/

任意の文字列でYouTubeおよびYouTube Musicリンクを検出します

0
Alex Smith

これがScalaで使用する私の答えです。これは、YouTubeのURLから11桁を抽出するのに役立ちます。

「https?://(?:[0-9a-zA-Z-] +。)?(?:www.youtube.com/ | youtu.be\S * [^\w-\s])([\w-] {11})(?= [^\w-] | $)(?![?=&+%\ w] (?:[\ '"] [^ <>]> |))[?=&+%\ w-] * "

def getVideoLinkWR: UserDefinedFunction = udf(f = (videoLink: String) => {
    val youtubeRgx = """https?://(?:[0-9a-zA-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w \-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>|</a>))[?=&+%\w-./]*""".r
    videoLink match {
        case youtubeRgx(a) => s"$a".toString
        case _ => videoLink.toString
    }
}
0
Martin Taco

この正規表現は私の問題を解決し、YouTubeリンクを取得、埋め込み、または共有リンクを取得できます

(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)

ここで確認できます https://regex101.com/r/Kvk0nB/1

0
Akash Jain

私はここからすべてのバリアントを取得しました:

https://Gist.github.com/rodrigoborgesdeoliveira/987683cfbfcc8d800192da1e73adc486#file-youtubeurlformats-txt

そして、この正規表現を作成しました(YouTube IDはグループ2にあります):

(\/|%3D|v=|vi=)([0-9A-z-_]{11})[%#?&\s]

ここで確認してください: https://regexr.com/4u4ud

編集:改行なしの単一の文字列で機能します。

0
Zec

これは、既存の回答を繰り返し、Edgeケースをより適切に処理します。 (例 http://thisisnotyoutu.be/thing

/(?:https?:\/\/|www\.|m\.|^)youtu(?:be\.com\/watch\?(?:.*?&(?:amp;)?)?v=|\.be\/)([\w‌​\-]+)(?:&(?:amp;)?[\w\?=]*)?/
0
DrewBaumann

JavaまたはAndroidのYouTube動画IDを取得するための完全なソリューションは次のとおりです。この機能で動作しないリンクは見つかりませんでした

public static String getValidYoutubeVideoId(String youtubeUrl)
{
    if(youtubeUrl == null || youtubeUrl.trim().contentEquals(""))
    {
        return "";
    }
    youtubeUrl = youtubeUrl.trim();
    String validYoutubeVideoId = "";
    String regexPattern = "^(?:https?:\\/\\/)?(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*";
    Pattern regexCompiled = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE);
    Matcher regexMatcher = regexCompiled.matcher(youtubeUrl);
    if(regexMatcher.find())
    {
        try
        {
            validYoutubeVideoId = regexMatcher.group(1);
        }
        catch(Exception ex)
        {
        }
    }
    return validYoutubeVideoId;
}
0
user3475539

Youtube動画URL iframe対応リンクへの変更:

正規表現: https://regex101.com/r/LeZ9WH/2/

http://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://youtu.be/n17B_uFF4cA
http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4
http://www.youtube.com/watch?v=t-ZRX8984sc
http://youtu.be/t-ZRX8984sc
https://youtu.be/2sFlFPmUfNo?t=1

PHP関数の例:

if (!function_exists('clean_youtube_link')) {

        /**
         * @param $link
         * @return string|string[]|null
         */
        function clean_youtube_link($link)
        {
            return preg_replace(
                '#(.+?)(\/)(watch\x3Fv=)?(embed\/watch\x3Ffeature\=player_embedded\x26v=)?([a-zA-Z0-9_-]{11})+#',
                "https://www.youtube.com/embed/$5",
                $link
            );
        }
}
0
Davron Achilov