URL에 다른 GET 변수가 무엇이든 관계없이 누군가 URL에서 YouTube ID를 얻는 방법을 보여줄 수 있습니까?
예를 들어 동영상을 사용 : http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
그래서 사이에 v=
, 다음 이전&
답변
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.
– 제이미 자윈 스키
답변
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);
답변
Anthony의 답변에 대한 bokor의 의견을 기반으로합니다.
preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);
$matches[1]
생생한 포함
성냥:
- 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
- https://m.youtube.com/watch?v=vidid
일치하지 않습니다 :
- www.facebook.com?wtv=youtube.com/v/vidid
답변
이것은 parse_str 및 parse_url을 사용하여 매우 쉽게 수행 할 수 있으며 내 의견으로는 더 안정적입니다.
내 기능은 다음 URL을 지원합니다.
- 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
기능 아래에 테스트도 포함됩니다.
/**
* 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";
}
답변
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
답변
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));
}
답변
동영상 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://youtube.com/?vi=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"
}