복붙노트

정규식을 사용하여 문자열의 모든 YouTube 동영상 ID를 찾으려면 어떻게해야하나요?

PHP

정규식을 사용하여 문자열의 모든 YouTube 동영상 ID를 찾으려면 어떻게해야하나요?

나는 사용자가 무엇이든 쓸 수있는 텍스트 필드를 가지고있다.

예 :

이제 구문 분석하고 모든 YouTube 동영상 URL과 해당 ID를 찾으려고합니다.

그게 어떻게 작동하는지 알아?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.시험

    시험

    [^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
    

    첫 번째 캡처 그룹에서 비디오 ID를 찾을 수 있습니다. 내가 모르는 부분은 유효한 비디오 ID 란 무엇입니까? 현재 v =를 확인하고 모두 -A-Za-z0-9_를 캡처합니다.

    샘플 문자열과 함께 rubular에서 온라인으로 확인했습니다.

  5. ==============================

    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. ==============================

    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. ==============================

    7.간단한 표현식을 사용하여 videoid 만 얻으려고했습니다.

    간단한 표현식을 사용하여 videoid 만 얻으려고했습니다.

    [?&]v=([^&#]*)
    

    온라인으로 phpliveregex에서 작동하는지 확인하십시오.

  8. ==============================

    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. ==============================

    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. ==============================

    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을 잘 작동합니다.

  11. 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