정규식을 사용하여 문자열 내의 모든 YouTube 비디오 ID를 찾으려면 어떻게 해야 하나요?
사용자가 무엇이든 쓸 수 있는 텍스트 필드가 있습니다.
예를 들어 다음과 같습니다.
Lorem Ipsum은 단순히 더미 텍스트입니다.인쇄 및 조판업계의 http://www.youtube.com/watch?v=DUQi_R4SgWo.로렘 입섬은 1500년대 이후 업계의 표준 더미 텍스트가 되어 왔습니다.그때 한 무명 프린터가 활자를 취하여 활자 견본서를 만들기 위해 그것을 스크램블했습니다.그것은 5세기 동안 생존했을 뿐만 아니라, 근본적으로 변하지 않은 채 전자 조판기로의 도약도 견뎌냈다.http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu 이것은 1960년대에 Lorem Ipsum의 구절을 포함한 Letraset 시트가 출시되면서 대중화되었고, 최근에는 Lorem Ipsum의 버전을 포함한 Aldus PageMaker와 같은 데스크톱 퍼블리싱 소프트웨어로 대중화되었습니다.
이제 해석하여 모든 YouTube 비디오 URL과 해당 ID를 찾습니다.
그게 어떻게 작동하는지 알아?
YouTube 비디오 URL에는 다양한 형식이 있습니다.
- " " " " " "
http://youtu.be/NLqAF9hrVbY
- iframe:
http://www.youtube.com/embed/NLqAF9hrVbY
- iframe(시큐어):
https://www.youtube.com/embed/NLqAF9hrVbY
- param: " 파라미터":
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- embedd : " " " " object : "
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- ★★★★★★
http://www.youtube.com/watch?v=NLqAF9hrVbY
- "사용자:
http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
- ytscreeningroom:
http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
- / anything / displays ! :
http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
- any/subdomain/too:
http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
- params : " " par파파 more more more more :
http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
- 에는 점을할 수 .
http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
- nocookie 도메인:
http://www.youtube-nocookie.com
다음은 코멘트 첨부 regex가 있는 PHP 함수입니다.이 함수는 각 URL 폼에 일치하여 링크(이미 링크가 아닌 경우)로 변환됩니다.
// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs($text) {
$text = preg_replace('~(?#!js YouTubeId Rev:20160125_1800)
# Match non-linked youtube URL in the wild. (Rev:20130823)
https?:// # Required scheme. Either http or https.
(?:[0-9A-Z-]+\.)? # Optional subdomain.
(?: # Group host alternatives.
youtu\.be/ # Either youtu.be,
| youtube # or youtube.com or
(?:-nocookie)? # youtube-nocookie.com
\.com # followed by
\S*? # Allow anything up to VIDEO_ID,
[^\w\s-] # but char before ID is non-ID char.
) # End host alternatives.
([\w-]{11}) # $1: VIDEO_ID is exactly 11 chars.
(?=[^\w-]|$) # Assert next char is non-ID or EOS.
(?! # Assert URL is not pre-linked.
[?=&+%\w.-]* # Allow URL (query) remainder.
(?: # Group pre-linked alternatives.
[\'"][^<>]*> # Either inside a start tag,
| </a> # or inside <a> element text contents.
) # End recognized pre-linked alts.
) # End negative lookahead assertion.
[?=&+%\w.-]* # Consume any URL (query) remainder.
~ix', '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>',
$text);
return $text;
}
; // $YouTubeId 종료.
다음은 동일한 regex를 사용하는 JavaScript 버전입니다(댓글을 삭제).
// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs(text) {
var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*?[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig;
return text.replace(re,
'<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>');
}
주의:
- VIDEO_ID로 됩니다.
$1
. - 텍스트에 사전 링크된 URL이 포함되어 있지 않은 경우 이 조건을 테스트하는 음의 사전 검색 어설션을 안전하게 제거할 수 있습니다(주석: "Assert URL is not-linked."로 시작하는 어설션). 이렇게 하면 정규식이 다소 빨라집니다.
- 치환 문자열은 필요에 따라 변경할 수 있습니다.를 통해 만 작성하면 됩니다.
"http://www.youtube.com/watch?v=VIDEO_ID"
및 를 다음과 같이 합니다."YouTube link: VIDEO_ID"
.
2011-07-05 편집: 추가됨-
char (ID char 클래스)
2011-07-17 편집: YouTube ID에 이은 URL의 나머지 부분(쿼리 등)을 소비하도록 regex 수정.추가된'i'
ignore-case 수식자함수의 이름을 camel Case로 변경.사전 링크된 사전 검색 테스트가 개선되었습니다.
2011-07-27 편집: YouTube URL의 새로운 "사용자" 형식과 "ytscreeningroom" 형식이 추가되었습니다.
2011-08-02 편집: 새로운 "모든 것" 유튜브 URL을 처리하기 위해 단순화/일반화되었습니다.
2011-08-25 편집: 몇 가지 수정 사항:
- Javascript 버전 추가:
linkifyYouTubeURLs()
기능. - 이전 버전에는 스킴(HTTP 프로토콜) 부분이 선택 사항이므로 잘못된 URL과 일치합니다. 스킴 부분이 필요합니다.
- 이전 버전에서는
\b
VIDEO_ID 주위의 워드 경계 앵커.단, VIDEO_ID가 시작 또는 종료되는 경우에는 동작하지 않습니다.-
대시. 이 상태를 처리할 수 있도록 고정되었습니다. - VIDEO_ID 식을 정확히 11자로 변경.
- 이전 버전에서는 VIDEO_ID 뒤에 쿼리 문자열이 있는 경우 사전 링크된 URL을 제외하지 못했습니다.이 문제를 해결하기 위해 음의 선행 어설션을 개선했습니다.
- 추가된
+
그리고.%
쿼리 문자열과 일치하는 문자 클래스로 이동합니다. - PHP 버전 regex 딜리미터가 다음에서 변경되었습니다.
%
a:~
. - 편리한 메모와 함께 "Notes" 섹션을 추가했습니다.
2011-10-12 편집: YouTube URL 호스트 부분에 서브도메인(단순히 서브도메인만 포함)이 추가됨www.
).
2012-05-01 편집:이제 소비 URL 섹션에서 '-'를 사용할 수 있습니다.
2013-08-23 편집: @Mei에서 제공하는 추가 형식 추가(쿼리 부분에는.
점.
2013-11-30 편집: @CRONUS에서 제공하는 추가 형식 추가:youtube-nocookie.com
.
2016-01-25 편집 : CRONUS에서 제공하는 에러 케이스를 처리하기 위해 regex를 수정하였습니다.
다음은 유튜브와 Vimeo 비디오 키를 추출하는 프로젝트를 위해 작성한 방법입니다.
/**
* strip important information out of any video link
*
* @param string link to a video on the hosters page
* @return mixed FALSE on failure, array on success
*/
function getHostInfo ($vid_link)
{
// YouTube get video id
if (strpos($vid_link, 'youtu'))
{
// Regular links
if (preg_match('/(?<=v\=)([\w\d-_]+)/', $vid_link, $matches))
return array('host_name' => 'youtube', 'original_key' => $matches[0]);
// Ajax hash tag links
else if (preg_match('§([\d\w-_]+)$§i', $vid_link, $matches))
return array('host_name' => 'youtube', 'original_key' => $matches[0]);
else
return FALSE;
}
// Vimeo get video id
elseif (strpos($vid_link, 'vimeo'))
{
if (preg_match('§(?<=/)([\d]+)§', $vid_link, $matches))
return array('host_name' => 'vimeo', 'original_key' => $matches[0]);
else
return FALSE;
}
else
return FALSE;
}
- 텍스트에서 모든 링크를 추출할 정규식을 찾습니다.구글이 도와줄 것이다.
- 모든 링크를 루프하고 각각 getHostInfo()를 호출합니다.
Ridgerunner의 답변이 제 답변의 근거가 되지만, 그의 답변이 모든 URL에 대해 해결되는 것은 아닙니다.또, 복수의 일치로 인해, 그것이 가능하다고는 생각하지 않습니다.VIDEO_ID
My regex는 마지막 수단으로 공격적인 접근을 포함하지만 모든 일반적인 매칭을 먼저 시도하므로 나중에 URL에서 잘못된 매칭이 발생할 가능성을 크게 줄입니다.
이 정규식:
/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=&+%\w-]*/ig;
원래 ridgerunners 예에서 참조된 모든 케이스와 URL 뒷부분에서 11자 시퀀스를 가질 수 있는 모든 URL을 처리합니다.즉,
http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit
다음은 모든 샘플 YouTube URL을 테스트하는 작업 샘플입니다.
해라
[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
첫 번째 캡처 그룹에서 비디오 ID를 찾을 수 있습니다.란한 디란 란란 란란 란란 란란? ★★★★★★★★★★를 확인하고 있습니다.v=
캡처해 주세요.-A-Za-z0-9_
.
당신의 샘플 끈으로 여기 루블라에서 온라인으로 확인했습니다.
용도:
<?php
// The YouTube URL string
$youtube_url='http://www.youtube.com/watch?v=8VtUYvwktFQ';
// Use regex to get the video ID
$regex='#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#';
preg_match($regex, $youtube_url, $id);
// Plug that into our HTML
?>
좋아, 난 나만의 기능을 만들었어하지만 나는 그것이 꽤 비효율적이라고 생각한다.어떠한 개선도 환영합니다.
function get_youtube_videos($string) {
$ids = array();
// Find all URLs
preg_match_all('/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/', $string, $links);
foreach ($links[0] as $link) {
if (preg_match('~youtube\.com~', $link)) {
if (preg_match('/[^=]+=([^?]+)/', $link, $id)) {
$ids[] = $id[1];
}
}
}
return $ids;
}
원본 포스터는 "파싱하여 모든 유튜브 동영상 URL과 ID를 찾고 싶다"고 물었다.위의 가장 인기 있는 답변을 preg_match로 전환하여 비디오 ID와 URL을 반환했습니다.
게시물에서 YouTube URL 및 ID 가져오기:
$match[0] = Full URL
$match[1] = video ID
function get_youtube_id($input) {
$input = preg_match('~https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:[\'"][^<>]*>|</a>))[?=&+%\w.-]*~ix',
$input, $match);
return $match;
}
videoid만 얻기 위해 간단한 표현을 시도했습니다.
[?&]v=([^&#]*)
여기 phliveregex에서 온라인으로 확인하세요.
문자열에서 YouTube 링크를 쉽게 찾을 수 있습니다.
function my_url_search($se_action_data)
{
$regex = '/https?\:\/\/[^\" ]+/i';
preg_match_all($regex, $se_action_data, $matches);
$get_url=array_reverse($matches[0]);
return array_unique($get_url);
}
echo my_url_search($se_action_data)
String urlid="" ;
String url="http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s";
Pattern pattern =Pattern.compile("(?:http|https|)(?::\\/\\/|)(?:www.|)(?:youtu\\.be\\/|youtube\\.com(?:\\/embed\\/|\\/v\\/|\\/watch\\?v=|\\/ytscreeningroom\\?v=|\\/feeds\\/api\\/videos\\/|\\/user\\\\S*[^\\w\\-\\s]|\\S*[^\\w\\-\\s]))([\\w\\-\\_]{11})[a-z0-9;:@#?&%=+\\/\\$_.-]*");
Matcher result = pattern.matcher(url);
if (result.find())
{
urlid=result.group(1);
}
이 자바 코드는 현재 모든 유튜브 URL에서 완벽하게 작동합니다.
언급URL : https://stackoverflow.com/questions/5830387/how-do-i-find-all-youtube-video-ids-in-a-string-using-a-regex
'programing' 카테고리의 다른 글
Nginx 403은 모든 파일에 대해 금지됩니다. (0) | 2023.01.30 |
---|---|
MySQL: 필드 크기/길이순으로 정렬 (0) | 2023.01.30 |
JavaScript에서 불변성이 중요한(또는 필요한) 이유는 무엇입니까? (0) | 2023.01.30 |
busboy에 문제가 있어 Content-Type을 찾을 수 없다 (0) | 2023.01.30 |
Intelij Spring Initializer를 사용할 수 없습니다. (0) | 2023.01.30 |