유튜브 비디오 ID를 얻기 위해 PHP 정규식?


137

URL에 다른 GET 변수가 무엇이든 관계없이 누군가 URL에서 YouTube ID를 얻는 방법을 보여줄 수 있습니까?

예를 들어 동영상을 사용 : http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
그래서 사이에 v=, 다음 이전&


1
도움이 될 것입니다 stackoverflow.com/questions/9522868/…

1
내 코드 github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… 를 봐야합니다. YouTube, vimeo 및 dailymotion에서 id를 추출하는 기능을 제공합니다.
ling

getVideoThumbnailByUrl () 함수의 @ling Vimeo에 더 이상 사용되지 않는 file_get_contents ()를 사용하고있었습니다. 이 교체품은 모든 곳에서 작동합니다.$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $hash =unserialize(curl_exec($ch)); curl_close($ch);
jerrygarciuh

@ling 또한 getYoutubeId ($ url)에서 최종 조건은 모든 문자열을 수락하고 YT id로 유효성을 검사합니다. 나는 '정크'를 전달했으며 해당 문자열에서 파싱 된 ID로 정크를 반환했습니다.
jerrygarciuh

@jerrygarciuh : afaik file_get_contents는 더 이상 사용되지 않으므로이 기능에 문제가 있으면 github에 문제를보고하십시오. getYoutubeId에서 오류를 발견해 주셔서 감사합니다 (강화했습니다).
ling

답변:


304

parse_url ()parse_str () 사용 .

(정규식은 거의 무엇이든 사용할 수 있지만 오류를 만드는 것은 매우 쉽습니다. 따라서 달성하려는 PHP 함수가 있으면 사용하십시오.)

parse_url은 문자열을 가져 와서 정보가 많은 배열로 잘라냅니다. 이 배열을 사용하거나 원하는 하나의 항목을 두 번째 인수로 지정할 수 있습니다. 이 경우 쿼리에 관심이 있습니다.PHP_URL_QUERY 있습니다.

이제 쿼리가 v=C4kxS1ksqtw&feature=relate있지만, 이후의 부분 만 원합니다 v=. 이를 위해 parse_str기본적으로 GET문자열 과 같이 작동 합니다. 문자열을 가져와 문자열에 지정된 변수를 만듭니다. 이 경우, $v$feature생성된다. 에 관심이 $v있습니다.

안전 parse_url을 위해 네임 스페이스에 있는 모든 변수를 저장하고 싶지는 않습니다 (멜로우 순 주석 참조). 대신 변수를 배열의 요소로 저장하여 저장하는 변수를 제어 할 수 있으며 실수로 기존 변수를 덮어 쓸 수 없습니다.

모든 것을 종합하면 다음과 같은 이점이 있습니다.

<?php
$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate";
parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
echo $my_array_of_vars['v'];    
  // Output: C4kxS1ksqtw
?> 

작업 예


편집하다:

hehe-감사합니다 Charles. 그것은 나를 웃게했다. 나는 전에 Zawinski 인용을 본 적이 없다.

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems.제이미 자윈 스키


1
정규식을 사용하지 않지만 (적어도 눈에 띄게-나는 parse_url()후드에서 어떻게 작동 하는지 잘 모르겠습니다 ), 이것이 갈 길입니다.
Thomas Owens

11
<Zawinski 견적을 여기에 삽입하십시오>. 모든 진지함에도 불구하고, 언어 함수를 사용하여 작업을 수행하는 것은 좋은 정규 표현식이 요구할 수있는 후프 점프보다 종종 나을 것입니다.
찰스

1
parse_str ()의 두 번째 매개 변수를 사용하여 쿼리 매개 변수를 배열에 저장하는 것이 좋습니다. 얇은 공기에서 마술처럼 변수가 나타나는 것은 결코 좋은 생각이 아닙니다.
mellowsoon

2
()의 "마법 변수"parse_str를 사용하는 이유 빠른 간단한 예는 좋은 아이디어 아닙니다 -> pastebin.com/AtaaPH4r
mellowsoon

1
@Qualcuno-물론 아닙니다. 이것은 OP 당 "get 변수"를 검색하기위한 것입니다. 귀하의 예에는 변수가 없습니다.
Peter Ajtai

154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

이것은 계정

youtube.com/v/{vidid}
youtube.com/vi/{vidid}
youtube.com/?v={vidid}
youtube.com/?vi={vidid}
youtube.com/watch?v={vidid}
youtube.com/watch?vi={vidid}
youtu.be/{vidid}

http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1 을 지원하기 위해 약간 개선했습니다 .

내가 지금 사용하는 라인은 다음과 같습니다

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);

3
다음과 같은 URL도 처리하도록 업데이트했습니다. youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs

11
이것은 모든 URL, inc 포함 문자열에서 작동합니다. (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob

3
이 /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& " ' >] +) /
bokor

2
사실의 bokor @ 코드는 웁니다 $matches내 프로젝트에 매우 유용 비디오 ID를 포함하여 더 많은 정보와 배열
cronoklee

2
Rob의 정규식에 추가하여 & list도 캡처되었습니다. 이것은 아래 정규식에서 제거됩니다. # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | (? <= embed \ /) [^ "&? \ n] + | (? <= ‌ (? : v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # 이제 지원됨 : youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/… ‌_AEyFjTvgtx //www.youtube.com/embed/ RRyG_mtYieI? list = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf

101

Anthony의 답변에 대한 bokor의 의견을 기반으로합니다.

preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);

$matches[1] 생생한 포함

성냥:

일치하지 않습니다 :

  • www.facebook.com?wtv=youtube.com/v/vidid

이 문자열의 C / objc / c ++ 버전이 있습니까? 어느 부분을 탈출해야할지 모르겠습니다.
João Nunes

"^ (? : http (? : s)? : //)? (? : www \\.)? (? : youtu \\. be / | youtube \\. com / (? :(? : watch)? \? (? :. * &)? v (? : i)? = | (? : embed | v | vi | user) /)) ([^ \? & \ " '>] +) "모든 예를 전달하지는 않음
João Nunes

1
내 문제를 찾았습니다. 여기에 마지막 c 문자열이 있습니다 : "^ (? : http (? : s)? : //)? (? : www \\.)? (? : youtu \\. be / | youtube \\. com / (? :( ?: watch)? \\? (? :. * &)? v (? : i)? = | (? : embed | v | vi | user) /)) ([^ \? & \ " '> ++"
João Nunes

youtube.com/watch?v=vidid#action=share 와 같은 URL을 고려 #하기 위해 엔딩 캡처 그룹에 다음을 추가했습니다 .preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell

1
공백이있는 내용을 추가하고 페이지의 URL 다음에 모든 텍스트를 가져옵니다. 이것이 더 좋습니다 / (?: http (? : s)? : \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / (? :( ?: watch)? \? (? :. * &)? v (? : i)? = | (? : embed | v | vi | user) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino

36

이것은 parse_strparse_url을 사용하여 매우 쉽게 수행 할 수 있으며 내 의견으로는 더 안정적입니다.

내 기능은 다음 URL을 지원합니다.

기능 아래에 테스트도 포함됩니다.

/**
 * Get Youtube video ID from URL
 *
 * @param string $url
 * @return mixed Youtube video ID or FALSE if not found
 */
function getYoutubeIdFromUrl($url) {
    $parts = parse_url($url);
    if(isset($parts['query'])){
        parse_str($parts['query'], $qs);
        if(isset($qs['v'])){
            return $qs['v'];
        }else if(isset($qs['vi'])){
            return $qs['vi'];
        }
    }
    if(isset($parts['path'])){
        $path = explode('/', trim($parts['path'], '/'));
        return $path[count($path)-1];
    }
    return false;
}
// Test
$urls = array(
    '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'
);
foreach($urls as $url){
    echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n";
}

이것은 정말 훌륭하고 실제로 vimeo 비디오에서도 작동합니다
Chris James Champeau

1
이것은 또한 내가 선호하는 답변입니다. YouTube와 Vimeo를 모두 다루고 있습니다. 한 가지 참고로, 추가 isset ()을 사용하여 약간의 미세 조정을 추가했습니다. 많은 감사합니다.
spedley

23

SOLTUION 모든 링크 유형! :

<?php
function get_youtube_id_from_url($url)  {
     preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results);    return $results[6];
}


echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla');
      // or                   http://youtu.be/GvJehZx3eQ1 
      // or                   http://www.youtube.com/embed/GvJehZx3eQ1
      // or                   http://www.youtu.be/GvJehZx3eQ1/blabla?xyz
?>

출력 : GvJehZx3eQ1


13

YouTube 동영상 ID를 확인하는 방법에 따라 수정 되었습니까?

<?php

$links = [
    "youtube.com/v/tFad5gHoBjY",
    "youtube.com/vi/tFad5gHoBjY",
    "youtube.com/?v=tFad5gHoBjY",
    "youtube.com/?vi=tFad5gHoBjY",
    "youtube.com/watch?v=tFad5gHoBjY",
    "youtube.com/watch?vi=tFad5gHoBjY",
    "youtu.be/tFad5gHoBjY",
    "http://youtu.be/qokEYBNWA_0?t=30m26s",
    "youtube.com/v/vidid",
    "youtube.com/vi/vidid",
    "youtube.com/?v=vidid",
    "youtube.com/?vi=vidid",
    "youtube.com/watch?v=vidid",
    "youtube.com/watch?vi=vidid",
    "youtu.be/vidid",
    "youtube.com/embed/vidid",
    "http://youtube.com/v/vidid",
    "http://www.youtube.com/v/vidid",
    "https://www.youtube.com/v/vidid",
    "youtube.com/watch?v=vidid&wtv=wtv",
    "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related",
    "youtube.com/watch?v=7HCZvhRAk-M"
];

foreach($links as $link){
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)([a-zA-Z0-9_-]+)#", $link, $matches);
    var_dump(end($matches));
}

9

동영상 ID의 길이는 11 자이며 앞에 v=or vi=또는 v/or vi/또는 앞에 올 수 있습니다 youtu.be/. 따라서 가장 간단한 방법은 다음과 같습니다.

<?php
$youtube = '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';

preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches);

var_dump($matches[0]);

그리고 출력 :

array(8) {
  [0]=>
  string(11) "dQw4w9WgXcQ"
  [1]=>
  string(11) "dQw4w9WgXcQ"
  [2]=>
  string(11) "dQw4w9WgXcQ"
  [3]=>
  string(11) "dQw4w9WgXcQ"
  [4]=>
  string(11) "dQw4w9WgXcQ"
  [5]=>
  string(11) "dQw4w9WgXcQ"
  [6]=>
  string(11) "dQw4w9WgXcQ"
  [7]=>
  string(11) "dQw4w9WgXcQ"
}

9

다음은 모든 YouTube 링크에서 작동합니다.

<?php
    // Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
    // http://youtu.be/dQw4w9WgXcQ
    // http://www.youtube.com/embed/dQw4w9WgXcQ
    // http://www.youtube.com/watch?v=dQw4w9WgXcQ
    // http://www.youtube.com/?v=dQw4w9WgXcQ
    // http://www.youtube.com/v/dQw4w9WgXcQ
    // http://www.youtube.com/e/dQw4w9WgXcQ
    // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
    // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
    // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
    // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
    // It also works on the youtube-nocookie.com URL with the same above options.
    // It will also pull the ID from the URL in an embed code (both iframe and object tags)

$url = "https://www.youtube.com/watch?v=v2_MLFVdlQM";

    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);

    $youtube_id = $match[1];

echo $youtube_id;
    ?>

4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];

고마워, 이것은 모든 도메인, http 및 https 및 URL의 다른 쓰레기를 원했기 때문에 나에게 효과적이었다.
MakuraYami

4
(?<=\?v=)([a-zA-Z0-9_-]){11}

이것도해야합니다.


4

유튜브 ID를 없애기 위해 암호로 작성해야하는 게시물 내용이있었습니다. <iframe>Youtube가 제공 하는 내장 코드 의 형태로 발생했습니다 .

 <iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe>

위의 @rob에서 얻은 다음 패턴. 스 니펫은 foreach일치하는 것이 발견되면 루프를 반복하며 추가 보너스를 위해 유튜브에서 발견 된 미리보기 이미지에 연결했습니다. 더 많은 유형의 Youtube 내장 유형 및 URL과 일치 할 수 있습니다.

$pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#';

preg_match_all($pattern, $post_content, $matches);

foreach ($matches as $match) {
    $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />";
    break;
}

Rob의 프로필 : https://stackoverflow.com/users/149615/rob


4

id캡처 그룹에서 를 추출하려면 다음 표현식 또는 그 파생어도 옵션이 될 수 있습니다.

(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)

데모

테스트

$re = '/(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)/';
$str = 'http://youtube.com/v/tFad5gHoBjY
https://youtube.com/vi/tFad5gHoBjY
http://www.youtube.com/?v=tFad5gHoBjY
http://www.youtube.com/?vi=tFad5gHoBjY
https://www.youtube.com/watch?v=tFad5gHoBjY
youtube.com/watch?vi=tFad5gHoBjY
youtu.be/tFad5gHoBjY
http://youtu.be/qokEYBNWA_0?t=30m26s
youtube.com/v/7HCZvhRAk-M
youtube.com/vi/7HCZvhRAk-M
youtube.com/?v=7HCZvhRAk-M
youtube.com/?vi=7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M
youtube.com/watch?vi=7HCZvhRAk-M
youtu.be/7HCZvhRAk-M
youtube.com/embed/7HCZvhRAk-M
http://youtube.com/v/7HCZvhRAk-M
http://www.youtube.com/v/7HCZvhRAk-M
https://www.youtube.com/v/7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M&wtv=wtv
http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M&feature=related
youtube.com/watch?v=7HCZvhRAk-M
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';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

산출

array(30) {
  [0]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [1]=>
  array(2) {
    [0]=>
    string(34) "https://youtube.com/vi/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [2]=>
  array(2) {
    [0]=>
    string(37) "http://www.youtube.com/?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [3]=>
  array(2) {
    [0]=>
    string(38) "http://www.youtube.com/?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [4]=>
  array(2) {
    [0]=>
    string(43) "https://www.youtube.com/watch?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [5]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [6]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [7]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/qokEYBNWA_0"
    [1]=>
    string(11) "qokEYBNWA_0"
  }
  [8]=>
  array(2) {
    [0]=>
    string(25) "youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [9]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/vi/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [10]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [11]=>
  array(2) {
    [0]=>
    string(27) "youtube.com/?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [12]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [13]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [14]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [15]=>
  array(2) {
    [0]=>
    string(29) "youtube.com/embed/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [16]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [17]=>
  array(2) {
    [0]=>
    string(36) "http://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [18]=>
  array(2) {
    [0]=>
    string(37) "https://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [19]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [20]=>
  array(2) {
    [0]=>
    string(57) "http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [21]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [22]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [23]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/vi/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [24]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [25]=>
  array(2) {
    [0]=>
    string(42) "http://www.youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [26]=>
  array(2) {
    [0]=>
    string(34) "http://youtube.com/?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [27]=>
  array(2) {
    [0]=>
    string(38) "http://youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [28]=>
  array(2) {
    [0]=>
    string(39) "http://youtube.com/watch?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [29]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
}

표현식을 단순화 / 수정 / 탐색하려면 regex101.com의 오른쪽 상단에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 확인할 수도 있습니다.


정규식 회로

jex.im은 정규 표현식을 시각화합니다.

여기에 이미지 설명을 입력하십시오



2
$vid = preg_replace('/^.*(\?|\&)v\=/', '', $url);  // Strip all meuk before and including '?v=' or '&v='.

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid);  // Strip trailing meuk.

2

스레드의 제목은 정규식의 사용을 의미하지만 Zawinski의 인용과 같이 정규 표현식을 피하는 것이 가장 좋습니다. 대신이 기능을 권장합니다.

function get_youtube_id($url)
{
    if (strpos( $url,"v=") !== false)
    {
        return substr($url, strpos($url, "v=") + 2, 11);
    }
    elseif(strpos( $url,"embed/") !== false)
    {
        return substr($url, strpos($url, "embed/") + 6, 11);
    }

}

URL 스타일과 관계없이 YouTube 동영상의 ID는 항상 동일하므로 권장합니다. 예 :

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `그리고 단어 "포함 /"이 Id 앞에 놓인 다른 Ulr 형식 ...

임베디드 및 iframe에디 드 제품 의 경우도 마찬가지입니다 .


0

http://snipplr.com/view/62238/get-youtube-video-id-very-robust/ 에서 온라인으로 찾았습니다 .

function getYouTubeId($url) {
// Format all domains to http://domain for easier URL parsing
str_replace('https://', 'http://', $url);
if (!stristr($url, 'http://') && (strlen($url) != 11)) {
    $url = 'http://' . $url;
}
$url = str_replace('http://www.', 'http://', $url);

if (strlen($url) == 11) {
    $code = $url;
} else if (preg_match('/http:\/\/youtu.be/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 1, 11);
} else if (preg_match('/watch/', $url)) {
    $arr = parse_url($url);
    parse_str($url);
    $code = isset($v) ? substr($v, 0, 11) : false;
} else if (preg_match('/http:\/\/youtube.com\/v/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 3, 11);
} else if (preg_match('/http:\/\/youtube.com\/embed/', $url, $matches)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 7, 11);
} else if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches) ) {
    $code = substr($matches[0], 0, 11);
} else {
    $code = false;
}

if ($code && (strlen($code) < 11)) {
    $code = false;
}

return $code;
}

0

Shawn의 답변 에서 얻은 데이터를 사용 했지만 정규식을 약간 일반화하고 단축했습니다. 이것과의 주요 차이점은 유효한 Youtube URL을 테스트하지 않고 비디오 ID를 찾는 것입니다. 의 동영상 ID는 계속 반환됩니다 www.facebook.com?wtv=youtube.com/v/vidid. 모든 테스트 사례에서 작동하지만 조금 더 느슨합니다. 결과적으로 다음과 같은 것에 대해 오 탐지를 출력합니다 https://www.twitter.com/watch?v=vidid. 데이터가 슈퍼 일치하지 않는 경우 그렇지 않은 경우보다 구체적인 정규식 사용하거나,이 방법을 사용 parse_url()하고를 parse_str().

preg_match("/([\?&\/]vi?|embed|\.be)[\/=]([\w-]+)/",$url,$matches);
print($matches[2]);

0

나는 당신이 이것을하려고한다고 생각합니다.

<?php
  $video = 'https://www.youtube.com/watch?v=u00FY9vADfQ';
  $parsed_video = parse_url($video, PHP_URL_QUERY);
  parse_str($parsed_video, $arr);
?>
<iframe
src="https://www.youtube.com/embed/<?php echo $arr['v'];  ?>"
frameborder="0">
</iframe>

0

다른 문자로 가득 찬 문자열에서 youtue URL을 추출하려면 어떻게해야합니까? 이처럼 :

Lorem ipsum dolor는 amet, conditetur adipiscing elit, eiusmod tempor incididunt ut worke et dolore magna aliqua와 같이 앉습니다. Ut enim ad minim veniam, quis nostrud exercitation ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 노동력은 작별 인사에 대한 후속 조치입니다. Volistate velit esse cillum dolore eu fugiat nulla pariatur에서 reprehenderit에 Duis aute irure dolor가 있습니다. Excepteur sint occaecat cupidatat nonidentident, culpa qui officiser deserunt mollit animid est labourum에서 침몰.

해당 문자열에서 https://www.youtube.com/watch?v=cPW9Y94BJI0 을 얻 습니까?


0

이 코드를 사용하십시오 :

$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related"; 
$parse = parse_url($url, PHP_URL_QUERY); 
parse_str($parse, $output); 
echo $output['watch'];

결과 : C4kxS1ksqtw

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