URL에서 YouTube 비디오 ID를 어떻게 얻습니까?


256

v=idJavaScript (jQuery, 순수 JavaScript 없음)를 사용하여 YouTube의 URL에서 가져오고 싶습니다 .

YouTube URL 형식의 예

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

또는 URL에 비디오 ID가 포함 된 다른 YouTube 형식.

이 형식의 결과

u8nQa1cJyX8



그 질문은 내 두 번째 질문과 같은 형식에만 해당됩니다. 그러나 나는 거기에 흥미로운 답변을 찾았습니다.
Adam

이에 대한 정규 표현식이 있습니다. http://pregcopy.com/exp/27
Exos


2
2015 년 기준 : 이 답변으로 건너 뛰십시오 . 다른 답변이 오래되었습니다.
Lenar Hoyt

답변:


109

이를 위해 정규 표현식을 사용할 필요는 없습니다.

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}

이것은이 코드를 기반으로 원하는 곳에서 작동하게하는 유용한 기능입니다. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); 함수 ytid (video_url) {var video_id = video_url.split ( 'v =') [1]; var ampersandPosition = video_id.indexOf ( '&'); if (ampersandPosition! = -1) {video_id = video_id.substring (0, 앰퍼샌드 위치); } alert (video_id); return video_id; }
지노

9
포함 된 URL을 처리하지 않음
Serge

14
또한 '공유'생성 된 URL을 처리하지 않습니다.https://youtu.be/{{video_id}}
hamncheez

2
이 정규식은 YouTube 공유 및 시청 URL과 잘 작동합니다. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

"jeffreypriebe"에서 제공하는 Regex를 개선했습니다. 채널을 통해 볼 때 비디오의 URL 인 YouTube URL이 필요했기 때문입니다.

글쎄요, 그러나 이것은 제가 무장 한 기능입니다.

<script type="text/javascript">
function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}
</script>

지원되는 URL 유형입니다

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg

[http://web.archive.org/web/20160926134334/] 에서 찾을 수 있습니다 . http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube


6
정규식에는 작은 버그 \ ?? v? =? 이것은 시계 부분에 있어야합니다. 그렇지 않으면 ID가 'v'로 시작하면 'v'를 필터링합니다. 그래서 이것은 트릭을 수행해야합니다 /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
웹 스트랩

69
심지어 더 깨끗합니다 : /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ 그런 다음 match[1]대신 사용하십시오 match[7](약간 임의적 인 것처럼 보입니다). 또한 WebDev에서 지적한 버그를 수정합니다.
Chris Nolet

3
YouTube ID가 12 자 길이가 될 때까지 얼마나 걸립니까?
Lenar Hoyt

1
anything.com/watch?v=jn40gqhxoSY 넣으면 정말 완벽하지 않다는 것을 알고 계셨습니까? 그것은 유튜브 URL이라고 생각합니다
Gino

1
누구나이 reqex를 확장 할 수 있으므로 불평하는 사람들은 말이되지 않습니다.
Lecha Bisultanov '12

241

Lasnv의 답변을 약간 단순화했습니다.

또한 WebDeb이 설명하는 버그를 수정합니다.

여기있어:

var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = url.match(regExp);
if (match && match[2].length == 11) {
  return match[2];
} else {
  //error
}

재생할 regexer 링크는 다음과 같습니다. http://regexr.com/3dnqv


2
그냥 머리 위로 : 이것은 당신이 유튜브 URL을 다루고 있음을 알고있을 때만 사용해야합니다. I는 (부당) 가양 의한 무비 등의 URL, 즉이 패스를 검증하는 데 사용되는 'V / 2059-9080-5437'
fabi

3
YouTube 도메인을 확인하는 다른 정규식을 사용하고 있습니다. /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w-] {11}). * /
mantish

4
YouTube는 언제 동영상 ID로 12 자로 전환합니까?
Lenar Hoyt

"youtu.be"의 점을 벗어나면 안됩니까?
Alex

당신이 맞아요 @jitbit 감사합니다. 일반적으로 탈출하지 않고도 잘 작동합니다.
mantish

85

이들 중 어느 것도 2015 년 1 월 1 일부로 부엌 싱크대에서 작동하지 않았으며, 특히 프로토 타입 http / s가없고 youtube-nocookie 도메인이있는 URL이 없었습니다. 여기 다양한 유튜브 버전에서 작동하는 수정 된 버전이 있습니다 :

// Just the regex. Output is in [1].
/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/

// For testing.
var urls = [
    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
    'http://youtu.be/6dwqZw0j_jY',
    'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
    'http://youtu.be/afa-5HQHiAs',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
    'http://www.youtube.com/watch?v=peFZbP64dsU',
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
];

var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/;

for (i = 0; i < urls.length; ++i) {
    r = urls[i].match(rx);
    console.log(r[1]);
}

2
위의 솔루션 중 많은 부분이이 광범위한 URL을 다루지 않는다는 점에 주목할 필요가 있습니다. 테스트 스크립트는 +1입니다.
0:56에

2
이것은 "www.engadget.com/watch?v=dQw4w9WgXcQ"와 같은 것에 의해 바보가 될 것입니다. 그러나 이것이 문제 일 가능성은 없습니다.
binaryfunt

작동하지만 여러 YouTube URL이있는 텍스트로 인해 발생하는 문제를 해결할 수 없었습니다 . regex101.com/r/qK5qJ5/1을 참조하십시오 . 두 번째 URL을 대체해서는 안됩니다.
Ashish

2
당신은 빈 ID에 일치하는 것을 원하지 않는 경우 : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(예 youtube.com/watch?v= 일치하지 않습니다)
zurfyx

"이 중 어느 것도 부엌 싱크대에서 작동하지 않았다"는 것은 무엇을 의미합니까?
rmutalik

26
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

에 테스트 :

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=ko_rel&rel=0
  • http://www.youtube.com/embed/0zM3nApSvMg?rel=0
  • http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  • http://www.youtube.com/watch?v=0zM3nApSvMg
  • http://youtu.be/0zM3nApSvMg
  • http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/KdwsulMb8EQ
  • http://youtu.be/dQw4w9WgXcQ
  • http://www.youtube.com/embed/dQw4w9WgXcQ
  • http://www.youtube.com/v/dQw4w9WgXcQ
  • http://www.youtube.com/e/dQw4w9WgXcQ
  • http://www.youtube.com/watch?v=dQw4w9WgXcQ
  • http://www.youtube.com/?v=dQw4w9WgXcQ
  • http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ
  • http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=ko_KR&rel=0

이 다른 답변에서 영감을 얻었습니다 .


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). *는 그룹 1의 결과
Marc

19

YouTube에는 다양한 URL 스타일이 있으므로 Regex가 더 나은 솔루션이라고 생각합니다. 내 정규식은 다음과 같습니다.

^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*

그룹 3에는 YouTube ID가 있습니다

샘플 YouTube URL (현재 "레거시 포함 URL 스타일"포함)-위의 정규식은 모든 URL에서 작동합니다.

http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

Lasnv의 모자 팁


9
이 보드로 드로잉 보드로 돌아 가야합니다. 예, 위의 URL과 올바르게 일치합니다. 그러나 그것은 또한 잘못과 같은 다른 많은 비 유튜브 - URL 문자열을 일치합니다 "domain.com/embed/file.txt", "/tv/"하고 "Has anyone seen my watch?". 훨씬 정확한 솔루션에 대한 비슷한 질문에 대한 나의 대답 을 참조하십시오 .
ridgerunner

1
위의 정규 표현식은 "YouTube URL입니까?"라는 질문에 답하는 데 쓸모가 없습니다. 그러나 그것은 나의 목표가 아니었다. YouTube URL이 있습니다. ID 만 추출하는 것입니다. 네, 당신의 대답은 확실합니다 (그리고 내 것이 아닌 유스 케이스를 포함합니다).
jeffreypriebe 2

위에서 언급 한 것과 동일한 버그가 있습니다. id는 'v'로 시작합니다.
webstrap

감사합니다 @WebDev-YouTube가 ID에 av를 넣었는지 (또는 "v"로 ID를 시작하는지) 알고 있습니까?
jeffreypriebe

1
여전히 오늘 (2013-01-25)까지 작동합니다. 다음은 그 예입니다 : jsfiddle.net/bcmoney/yBP4J
bcmoney

17

유튜브, Soundcloud 또는 Vimeo 임베디드 ID에 대한 사용자 입력을 테스트하여 임베디드 미디어로 더욱 지속적인 디자인을 만들 수있는 기능을 만들었습니다. 이 함수는 "type"과 "id"라는 두 가지 속성을 가진 객체를 감지하고 반환합니다. 유형은 "youtube", "vimeo"또는 "soundcloud"일 수 있으며 "id"속성은 고유 한 미디어 ID입니다.

사이트에서 나는 텍스트 영역 덤프를 사용하는데, 여기서 사용자는 vimeo와 youtube의 iFrame-embedding을 포함하여 모든 유형의 링크 또는 소스 코드에 붙여 넣을 수 있습니다.

function testUrlForMedia(pastedData) {
var success = false;
var media   = {};
if (pastedData.match('http://(www.)?youtube|youtu\.be')) {
    if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; }
    else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
    media.type  = "youtube";
    media.id    = youtube_id;
    success = true;
}
else if (pastedData.match('http://(player.)?vimeo\.com')) {
    vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0];
    media.type  = "vimeo";
    media.id    = vimeo_id;
    success = true;
}
else if (pastedData.match('http://player\.soundcloud\.com')) {
    soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]);
    soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0];
    media.type  = "soundcloud";
    media.id    = soundcloud_id;
    success = true;
}
if (success) { return media; }
else { alert("No valid media id detected"); }
return false;
}

좋은 생각이지만 대부분의 URL 형식에서는 작동하지 않습니다. https 사이트에서 일치하지 않는 것을 포함합니다.
NickG

13

여기 게임에 늦었지만 mantish와 jw의 두 가지 훌륭한 반응을 냈습니다. 먼저 수정 된 정규식 :

const youtube_regex = /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

테스트 코드는 다음과 같습니다 (저는 mantish의 원래 테스트 사례를 jw의 초기 단계에 추가했습니다).

 var urls = [
      'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
      'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
      'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
      'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg',
      'http://youtu.be/0zM3nApSvMg',
      '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
      'http://youtu.be/6dwqZw0j_jY',
      'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
      'http://youtu.be/afa-5HQHiAs',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
      'http://www.youtube.com/watch?v=peFZbP64dsU',
      'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
      'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
      'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
  ];

  var failures = 0;
  urls.forEach(url => {
    const parsed = url.match(youtube_regex);
    if (parsed && parsed[2]) {
      console.log(parsed[2]);
    } else {
      failures++;
      console.error(url, parsed);
    }
  });
  if (failures) {
    console.error(failures, 'failed');
  }

댓글에 언급 된 m.youtube URL 을 처리하기위한 실험 버전 :

const youtube_regex = /^.*((m\.)?youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

이는 필요 parsed[2]로 변경하는 parsed[3](그 다음으로 통과 테스트에서 두 곳에서 m.youtube테스트에 추가 된 URL). 문제가 있으면 알려주세요.


1
문제가 있고 정규 표현식으로 해결할 수 있으므로 테스트 슈트에이 항목을 추가해야합니다. youtu.be/ve4f400859I . 편지 v는 이전 정규 표현식에서 제거되었습니다
Mark Odey

1
그것을 http://youtu.be/추가하면 /그것이 잘못된 것으로 표시됩니다. 에서 사용(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d

의견 주셔서 감사합니다. 내 예제를 아직 업데이트하지 않았으므로 (테스트 할 시간이 없음) 내 코드를 사용하는 사람은 메모하십시오 :-)
podperson

어떤 = m.youtube.com 유형의 URL에 대한
Mehul Thakkar

@MehulThakkar는 그렇지 않으면 youtube.com URL과 비슷합니까?
podperson

11

tl; dr.

이 질문에 대한 모든 URL 예와 일치하는 단어를 찾습니다.

let re = /^(https?:\/\/)?((www\.)?(youtube(-nocookie)?|youtube.googleapis)\.com.*(v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/)|youtu\.be\/)([_0-9a-z-]+)/i;
let id = "https://www.youtube.com/watch?v=l-gQLqv9f4o".match(re)[7];

ID는 항상 경기 그룹 7에 있습니다.

이 질문에 대한 답변에서 얻은 모든 URL의 실제 예 : https://regexr.com/3u0d4

전체 설명 :

많은 답변 / 댓글이 나오면 YouTube 동영상 URL에는 여러 가지 형식이 있습니다. "호스트 된"것처럼 보일 수있는 여러 TLD조차도.

위의 정규 표현식 링크를 통해 내가 확인한 유사 콘텐츠의 전체 목록을 볼 수 있습니다.

RegExp를 분류하자.

^문자열을 문자열의 시작 부분에 고정하십시오. (https?:\/\/)?선택적 프로토콜 http : // 또는 https : // ?앞의 항목을 선택 사항 s으로 설정 한 다음 전체 그룹 (괄호 세트로 묶인 항목)은 선택 사항입니다.

좋아,이 다음 부분은 그것의 고기입니다. 기본적으로 다양한 버전의 www.youtube.com/...[id]와 링크 단축 youtu.be/[id] 버전의 두 가지 옵션이 있습니다.

(                                                  // Start a group which will match everything after the protocol and up to just before the video id.
  (www\.)?                                         // Optional www.
  (youtube(-nocookie)?|youtube.googleapis)         // There are three domains where youtube videos can be accessed. This matches them.
  \.com                                            // The .com at the end of the domain. 
  .*                                               // Match anything 
  (v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/) // These are all the things that can come right before the video id. The | character means OR so the first one in the "list" matches.
  |                                                // There is one more domain where you can get to youtube, it's the link shortening url which is just followed by the video id. This OR separates all the stuff in this group and the link shortening url.
  youtu\.be\/                                      // The link shortening domain
)                                                  // End of group

마지막으로 비디오 ID를 선택할 그룹이 있습니다. 숫자, 문자, 밑줄 또는 대시 인 하나 이상의 문자.

([_0-9a-z-]+)

정규식 링크로 이동하여 표현식의 각 부분이 URL의 텍스트와 어떻게 일치하는지 확인하여 정규식의 각 부분에 대해 훨씬 자세한 정보를 찾을 수 있습니다.


10

내가 찾은 최고의 솔루션 (2019-2020)은 다음과 같습니다.

function YouTubeGetID(url){
   url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
   return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : url[0];
}

여기 에서 찾았습니다 .

/*
* Tested URLs:
var url = 'http://youtube.googleapis.com/v/4e_kz79tjb8?version=3';
url = 'https://www.youtube.com/watch?feature=g-vrec&v=Y1xs_xPb46M';
url = 'http://www.youtube.com/watch?feature=player_embedded&v=Ab25nviakcw#';
url = 'http://youtu.be/Ab25nviakcw';
url = 'http://www.youtube.com/watch?v=Ab25nviakcw';
url = '<iframe width="420" height="315" src="http://www.youtube.com/embed/Ab25nviakcw" frameborder="0" allowfullscreen></iframe>';
url = '<object width="420" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
url = 'http://i1.ytimg.com/vi/Ab25nviakcw/default.jpg';
url = 'https://www.youtube.com/watch?v=BGL22PTIOAM&feature=g-all-xit';
url = 'BGL22PTIOAM';
*/

TypeScript : const youTubeGetID = (url : string) => {const [a,, b] = url .replace (/ (> | <) / gi, '') .split (/ (vi \ / | v = | \ /v\/|youtu\.be\/|\/embed\/)/); if (b! == undefined) {return b.split (/ [^ 0-9a-z _-] / i) [0]; } else {return a; }};
블라드

v = nfDGK_WSFro에서 실패
Deen John

6

YouTube 동영상 ID는 11 자로 설정되어 있으므로 substringURL을로 분할 한 직후에 간단하게 사용할 수 있습니다 v=. 그런 다음 우리는 끝에 앰퍼샌드에 의존하지 않습니다.

var sampleUrl = "http://www.youtube.com/watch?v=JcjoGn6FLwI&asdasd";

var video_id = sampleUrl.split("v=")[1].substring(0, 11)

좋고 간단한 :)


이것은 말 그대로 받아 들여진 답변의 사본입니다
brasofilo

5

나는 모든 제안을 요약했으며 여기 에이 질문에 대한 보편적이고 짧은 대답이 있습니다.

if(url.match('http://(www.)?youtube|youtu\.be')){
    youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
}

5

자바 코드 : (모든 URL에서 작동 :

  1. http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  2. http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
  3. http://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=ko_KR&rel=0
  4. http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  5. http://www.youtube.com/embed/0zM3nApSvMg?rel=0 "
  6. http://www.youtube.com/watch?v=0zM3nApSvMg
  7. http://youtu.be/0zM3nApSvMg
  8. http://www.youtube.com/watch?v=0zM3nApSvMg/
  9. http://www.youtube.com/watch?feature=player_detailpage&v=8UVNT4wvIGY

)

    String url = "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index";

    String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        int start = matcher.end();
        System.out.println("ID : " + url.substring(start, start+11));

    }

DailyMotion의 경우 :

String url = "http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun";

    String regExp = "/video/([^_]+)/?";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        String match = matcher.group();
        System.out.println("ID : " + match.substring(match.lastIndexOf("/")+1));

    }

1
JavaScript 코드에서 정규식 패턴 주위에 큰 따옴표를 제거하면 작동합니다.
TheDude

4

약간 더 엄격한 버전 :

^https?://(?:www\.)?youtu(?:\.be|be\.com)/(?:\S+/)?(?:[^\s/]*(?:\?|&)vi?=)?([^#?&]+)

에 테스트 :

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel

4

다음 코드를 사용하여 URL에서 YouTube 비디오 ID를 가져올 수 있습니다.

url = "https://www.youtube.com/watch?v=qeMFqkcPYcg"
VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
alert(url.match(VID_REGEX)[1]);

다른 모든 정규식 예제에 문제가 있었지만 데스크톱에서 사람들이 사용하는 3 가지 공유 옵션에서 효과적으로 작동합니다. 주소 표시 줄의 URL, 공유 버튼의 URL 및 인라인 공유 버튼의 URL 감사!!!
마틴

2

게시 된 Mantish에서 약간 변경된 버전 :

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]{11,11}).*/;
var match = url.match(regExp);
if (match) if (match.length >= 2) return match[2];
// error

코드가 항상 11 자라고 가정합니다. ActionScript에서 이것을 사용하고 있는데, {11,11}이 Javascript에서 지원되는지 확실하지 않습니다. 또한 & v = ....에 대한 지원 추가


이것은 내가 테스트 한 URL에서 효과가있는 유일한 것입니다 : youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Dominic

완전한. 감사합니다 @Josha 69 링크 조합 나는 모든 것이 나를 위해 일하는 테스트합니다.
gokhan


2

하나 더:

var id = url.match(/(^|=|\/)([0-9A-Za-z_-]{11})(\/|&|$|\?|#)/)[2]

이 스레드에 표시된 모든 URL에서 작동합니다.

YouTube에서 11 개의 base64 문자로 다른 매개 변수를 추가하면 작동하지 않습니다. 그때까지는 쉬운 방법입니다.


2

아래에서 볼 수있는 Youtube URL에서 비디오 ID를 추출하는 작은 기능을 만들었습니다.

var videoId = function(url) {
   var match = url.match(/v=([0-9a-z_-]{1,20})/i);
   return (match ? match['1'] : false);
};

console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?t=17s&v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=17s'));

이 함수는 URL에 여러 개의 매개 변수가 있어도 비디오 ID를 추출합니다.


2

모든 유형의 YouTube 링크에서 동영상 ID를 얻을 수 있습니다.

var url= 'http://youtu.be/0zM3nApSvMg';
var urlsplit= url.split(/^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*/);
console.log(urlsplit[3]);

1

Surya의 답변이 마음에 들었습니다. 작동하지 않는 경우 ...

String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

작동하지 않습니다

youtu.be/i4fjHzCXg6c  and  www.youtu.be/i4fjHzCXg6c

업데이트 된 버전 :

String regExp = "/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

모두를 위해 작동합니다.


1

이거 한번 해봐 -

function getYouTubeIdFromURL($url) 
{
  $pattern = '/(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})/i';
  preg_match($pattern, $url, $matches);

  return isset($matches[1]) ? $matches[1] : false;
}

1

Lasnv의 Chris Nolet 클리너 예제는 매우 훌륭하지만 최근에 텍스트에서 YouTube 링크를 찾고 YouTube URL 뒤에 임의의 텍스트를 넣으려고하면 regexp가 필요 이상으로 일치한다는 것을 알았습니다. Chris Nolet 답변 개선 :

/^.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]{11,11}).*/


1
function parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\/)|(\?v=|\&v=))([^#\&\?]*).*/;
    var match = url.match(regExp);
    if (match && match[8].length==11){
            alert('OK');
    }else{
            alert('BAD');
    }
}

시험용:

https://www.youtube.com/embed/vDoO_bNw7fc - attention first symbol «v» in «vDoO_bNw7fc»

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel

0

글쎄, 간단한 파싱으로 그것을하는 방법은 첫 번째 = 기호 부터 시작 하여 첫 번째 & 기호에 이르기까지 모든 것을 얻는 것 입니다.

나는 그들이 비슷한 대답을했다고 생각한다.

JavaScript를 사용하여 Vimeo ID를 파싱 하시겠습니까?


2
URL에 포함되어 있지 않으면 어떻게해야 &합니까?
Adam

그런 다음 동등한 구분 기호를 찾아야합니다. 예를 들어, 첫 번째 URL은 & 기호입니다. 두 번째 URL에서 문자열의 끝은 구분 기호입니다.
karlphillip

0

이러한 문자 "? v ="는 둘 이상으로 표시 될 수 없지만 'v'는 ID 자체에 어떻게 든 나타날 수 있으므로 "? v ="를 구분 기호로 사용합니다. 를 참조하십시오 여기서 일하는

//Get YouTube video Id From Its Url

     $('button').bind('click',function(){
var 
url='http://www.youtube.com/watch?v=u8nQa1cJyX8',
videoId = url.split('?v='),//Split data to two
YouTubeVideoId=videoId[1];
alert(YouTubeVideoId);return false;

});

<button>Click ToGet VideoId</button>

0

전체 URL이 있으면 간단한 정규식을 유지하십시오.

results = url.match("v=([a-zA-Z0-9]+)&?")
videoId = results[1] // watch you need.

0
var video_url = document.getElementById('youtubediv').value;
        if(video_url!=""){
        ytid(video_url);
        document.getElementById("youtube").setAttribute("src","http://www.youtube.com/embed/"+ytid(video_url));
        }
        function ytid(video_url){
            var video_id = video_url.split('v=')[1];
            var ampersandPosition = video_id.indexOf('&');
            if(ampersandPosition != -1) {
                video_id = video_id.substring(0, ampersandPosition);
            }
            return video_id;
        }

나는 그것이 도움이되기를 바랍니다.


0
function youtube_parser(url){
    var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/);
    return (match&&match[7].length==11)?match[7]:false;
}

가장 짧고 효율적인


맞지 않다, 실패 vs youtube.com/e/dQw4w9WgXcQ 그래서 효율적인 부분을 꺼내주세요 :)
alecellis1985

0

코멘트에 언급 된 웹 스트랩 :

비디오가 "v"로 시작하고 youtu.be에서 온 경우 작동했습니다.

정규식에는 \??v?=?시계 부분에 있어야 하는 약간의 버그가 포함되어 있습니다. 그렇지 않으면 'v'ID가로 시작 하는 경우 a를 필터링 합니다 'v'. 그래서 이것은 트릭을해야합니다

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v?=?))([^#\&\?]*).*/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.