誰かが、Youtubeへのリンクの可能なほとんどすべての方法から(埋め込みオブジェクトではなく)Youtubeビデオへのリンクを取得する正規表現を持っていますか?
これはかなり一般的な問題だと思います。それにリンクする方法はたくさんあると思います。
開始点は次のようになります。
これまでのところ、これを得たRegular expression
私が投稿した例で機能し、最初のグループのIDを取得します。
http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?
IRCでhttpがまったくないリンクでも認識できるように、上記で投稿したリンクを友人とスクリプトで改善しました。これは、文字化けしたテキストなど、これまでに取得したすべてのストレステストで機能しました。認識可能なyoutubeのurlなので、ここにあります:
~(?:https?://)?(?:www\.)?youtu(?:be\.com/watch\?(?:.*?&(?:amp;)?)?v=|\.be/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?~
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
ここに示されているすべての正規表現をテストしましたが、クライアントが使用していたすべてのURLタイプをカバーできるものはありませんでした。
私はこれを試行錯誤してかなり構築しましたが、Poppy Deejayが投稿したすべてのパターンで動作するようです。
"(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/)([a-zA-Z0-9_-]{11})+"
多分それは私が今日持っていたのと同じような状況にいる誰かを助ける;)
最近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] ;
すべてのリンクフォーマットをカバーできれば、世界で最長のRegExになりますが、最初の2つのリンクフォーマットをカバーする方法を以下に示します。
http://(www\.)?youtube\.com/watch\?.*v=([a-zA-Z0-9]+).*
2番目のグループは、それを取得する必要がある場合にビデオIDと一致します。
私はそのようなリンクを扱っています:
http://www.youtube.com/v/M-faNJWc9T0?fs=1&rel=
そして、IDを取得するために使用しているregExは次のとおりです。
"(.+?)(\/v/)([a-zA-Z0-9_-]{11})+"
(?: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リンクを検出します
これが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
}
}
この正規表現は私の問題を解決し、YouTubeリンクを取得、埋め込み、または共有リンクを取得できます
(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)
ここで確認できます https://regex101.com/r/Kvk0nB/1
私はここからすべてのバリアントを取得しました:
そして、この正規表現を作成しました(YouTube IDはグループ2にあります):
(\/|%3D|v=|vi=)([0-9A-z-_]{11})[%#?&\s]
ここで確認してください: https://regexr.com/4u4ud
編集:改行なしの単一の文字列で機能します。
これは、既存の回答を繰り返し、Edgeケースをより適切に処理します。 (例 http://thisisnotyoutu.be/thing )
/(?:https?:\/\/|www\.|m\.|^)youtu(?:be\.com\/watch\?(?:.*?&(?:amp;)?)?v=|\.be\/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?/
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;
}
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
);
}
}