정규식을 사용하여 문자열의 모든 YouTube 동영상 ID를 찾으려면 어떻게해야하나요?
PHP정규식을 사용하여 문자열의 모든 YouTube 동영상 ID를 찾으려면 어떻게해야하나요?
나는 사용자가 무엇이든 쓸 수있는 텍스트 필드를 가지고있다.
예 :
이제 구문 분석하고 모든 YouTube 동영상 URL과 해당 ID를 찾으려고합니다.
그게 어떻게 작동하는지 알아?
해결법
-
==============================
1.YouTube 동영상 URL은 다양한 형식으로 표시 될 수 있습니다.
YouTube 동영상 URL은 다양한 형식으로 표시 될 수 있습니다.
다음은 각 URL 양식과 일치하는 주석 처리 된 정규식이있는 PHP 함수입니다 (이미 링크가 아닌 경우).
// 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를 가진 자바 스크립트 버전입니다 (주석을 제거했습니다) :
// 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>'); }
노트:
수정 2011-07-05 : 추가 - ID char 클래스에 하이픈
수정 2011-07-17 : 정규식이 YouTube ID 다음 URL의 나머지 부분 (예 : 검색어)을 사용하는 것을 수정했습니다. 'i'ignore-case 수정자를 추가했습니다. CamelCase로 이름이 바뀐 기능. 개선 된 사전 링크 된 선행 검사.
수정 2011-07-27 : YouTube URL의 새로운 '사용자'및 'ytscreeningroom'형식이 추가되었습니다.
수정 2011-08-02 : 단순화 된 / 일반화 된 URL로 새로운 "any / thing / goes"YouTube URL을 처리합니다.
수정 2011-08-25 : 몇 가지 수정 사항 :
2011-10-12 수정 : YouTube URL 호스트 부분에 이제 www가 아닌 하위 도메인이있을 수 있습니다.
수정 2012-05-01 : URL 사용 섹션에서 이제 '-'을 허용 할 수 있습니다.
2013-08-23 수정 : @Mei에서 제공하는 추가 형식을 추가했습니다. (쿼리 부분에 .dot가있을 수 있습니다.
2013-11-30 편집 : @CRONUS에서 제공하는 추가 형식 : youtube-nocookie.com을 추가했습니다.
편집 2016-01-25 : CRONUS가 제공 한 오류 케이스를 처리 할 수있는 고정 정규식.
-
==============================
2.YouTube 및 Vimeo 비디오 키를 추출하는 프로젝트에 대해 내가 한 번 작성한 방법은 다음과 같습니다.
YouTube 및 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; }
-
==============================
3.ridgerunner의 답변이 내 대답의 기본이지만, YouTube URL에서 VIDEO_ID와 (과) 여러 번 일치 할 가능성이 있기 때문에 YouTube에서 모든 URL을 해결하지 못해서 해결할 수 있다고 생각하지 않습니다. 내 정규식은 최후의 수단으로 공격적인 접근 방식을 포함하지만 모든 일반적인 일치를 먼저 시도하여 URL의 나중에 잘못된 일치가 발생할 가능성을 크게 줄입니다.
ridgerunner의 답변이 내 대답의 기본이지만, YouTube URL에서 VIDEO_ID와 (과) 여러 번 일치 할 가능성이 있기 때문에 YouTube에서 모든 URL을 해결하지 못해서 해결할 수 있다고 생각하지 않습니다. 내 정규식은 최후의 수단으로 공격적인 접근 방식을 포함하지만 모든 일반적인 일치를 먼저 시도하여 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을 모두 테스트하는 작업 샘플입니다.
http://jsfiddle.net/DJSwc/5/
-
==============================
4.시험
시험
[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
첫 번째 캡처 그룹에서 비디오 ID를 찾을 수 있습니다. 내가 모르는 부분은 유효한 비디오 ID 란 무엇입니까? 현재 v =를 확인하고 모두 -A-Za-z0-9_를 캡처합니다.
샘플 문자열과 함께 rubular에서 온라인으로 확인했습니다.
-
==============================
5.용도:
용도:
<?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 ?>
-
==============================
6.좋아, 나는 내 자신의 기능을했다. 하지만 꽤 비효율적이라고 생각합니다. 모든 개선 사항을 환영합니다.
좋아, 나는 내 자신의 기능을했다. 하지만 꽤 비효율적이라고 생각합니다. 모든 개선 사항을 환영합니다.
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; }
-
==============================
7.간단한 표현식을 사용하여 videoid 만 얻으려고했습니다.
간단한 표현식을 사용하여 videoid 만 얻으려고했습니다.
[?&]v=([^&#]*)
온라인으로 phpliveregex에서 작동하는지 확인하십시오.
-
==============================
8.원래 포스터는 "구문 분석하고 모든 YouTube 동영상 URL과 해당 ID를 찾으려고합니다."라고 물었습니다. 위의 가장 인기있는 답변을 preg_match로 바꾸고 비디오 ID와 URL을 반환했습니다.
원래 포스터는 "구문 분석하고 모든 YouTube 동영상 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; }
-
==============================
9.문자열에서 쉽게 YouTube 링크 찾기 :
문자열에서 쉽게 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)
-
==============================
10.
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); }
자바 에서이 코드는 절대적으로 모든 YouTube에 현재 URL을 잘 작동합니다.
from https://stackoverflow.com/questions/5830387/how-do-i-find-all-youtube-video-ids-in-a-string-using-a-regex by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
치명적인 오류 : 최대 실행 시간이 30 초를 초과했습니다. (0) | 2018.09.06 |
---|---|
bindParam과 bindValue의 차이점은 무엇입니까? (0) | 2018.09.06 |
PHP는 "PHP는 : / / 입력"대 $ _POST (0) | 2018.09.06 |
PHP에서 이스케이프 인용 부호 (0) | 2018.09.06 |
ajax 요청을 사용하여 파일 다운로드 (0) | 2018.09.06 |