복붙노트

preg_match를 사용하여 youtube video id 구문 분석

PHP

preg_match를 사용하여 youtube video id 구문 분석

preg_match를 사용하여 YouTube URL의 동영상 ID를 구문 분석하려고합니다. 이 사이트에서 정규 표현식이 작동하는 것으로 나타났습니다.

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+

이 그림에 표시된 것처럼 :

내 PHP는 다음과 같습니다,하지만 작동하지 않습니다 (Unknown modifier '['error) ...).

<?
 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

 print "<pre>";
 print_r($matches);
 print "</pre>";

?>

건배

해결법

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

    1.이 정규식은 내가 찾을 수있는 다양한 URL에서 ID를 가져옵니다 ... 그곳에는 더 많은 것들이 있을지 모르지만, 나는 어디에서든지 그것들의 참조를 찾을 수 없었다. 일치하지 않는 URL이 하나라도 발견되면 URL에 의견을 남기십시오. URL에 맞게 정규식을 업데이트 해 보겠습니다.

    이 정규식은 내가 찾을 수있는 다양한 URL에서 ID를 가져옵니다 ... 그곳에는 더 많은 것들이 있을지 모르지만, 나는 어디에서든지 그것들의 참조를 찾을 수 없었다. 일치하지 않는 URL이 하나라도 발견되면 URL에 의견을 남기십시오. URL에 맞게 정규식을 업데이트 해 보겠습니다.

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

    이 정규식과 일치하는 URL의 샘플은 다음과 같습니다 (무시되는 URL 뒤에 더 많은 콘텐츠가있을 수 있음).

    위의 옵션과 동일한 youtube-nocookie.com URL에서도 작동합니다.

    또한 embed 코드의 URL에서 ID를 가져옵니다 (iframe 및 object 태그 모두).

  2. ==============================

    2.parse_url 및 parse_str을 사용하여 URL 및 쿼리 문자열을 구문 분석하는 것이 더 좋습니다.

    parse_url 및 parse_str을 사용하여 URL 및 쿼리 문자열을 구문 분석하는 것이 더 좋습니다.

    $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
    $url = parse_url($subject);
    parse_str($url['query'], $query);
    var_dump($query);
    
  3. ==============================

    3.나는 몇 주 전에 PHP 클래스를 다루어야했는데, 어떤 종류의 문자열과도 일치하는 정규식으로 끝났다 : URL 스키마 유무에 관계없이 하위 도메인 유무에 관계없이 youtube.com URL 문자열, youtu.be URL 문자열 및 모든 종류의 매개 변수 정렬 처리. GitHub에서 확인하거나 아래 코드 블록을 복사하여 붙여 넣기 만하면됩니다.

    나는 몇 주 전에 PHP 클래스를 다루어야했는데, 어떤 종류의 문자열과도 일치하는 정규식으로 끝났다 : URL 스키마 유무에 관계없이 하위 도메인 유무에 관계없이 youtube.com URL 문자열, youtu.be URL 문자열 및 모든 종류의 매개 변수 정렬 처리. GitHub에서 확인하거나 아래 코드 블록을 복사하여 붙여 넣기 만하면됩니다.

    /**
     *  Check if input string is a valid YouTube URL
     *  and try to extract the YouTube Video ID from it.
     *  @author  Stephan Schmitz <eyecatchup@gmail.com>
     *  @param   $url   string   The string that shall be checked.
     *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
     */        
    function parse_yturl($url) 
    {
        $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
        preg_match($pattern, $url, $matches);
        return (isset($matches[1])) ? $matches[1] : false;
    }
    

    정규식을 설명하기 위해 여기 분할 된 버전이 있습니다.

    /**
     *  Check if input string is a valid YouTube URL
     *  and try to extract the YouTube Video ID from it.
     *  @author  Stephan Schmitz <eyecatchup@gmail.com>
     *  @param   $url   string   The string that shall be checked.
     *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
     */        
    function parse_yturl($url) 
    {
        $pattern = '#^(?:https?://)?';    # Optional URL scheme. Either http or https.
        $pattern .= '(?:www\.)?';         #  Optional www subdomain.
        $pattern .= '(?:';                #  Group host alternatives:
        $pattern .=   'youtu\.be/';       #    Either youtu.be,
        $pattern .=   '|youtube\.com';    #    or youtube.com
        $pattern .=   '(?:';              #    Group path alternatives:
        $pattern .=     '/embed/';        #      Either /embed/,
        $pattern .=     '|/v/';           #      or /v/,
        $pattern .=     '|/watch\?v=';    #      or /watch?v=,    
        $pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
        $pattern .=   ')';                #    End path alternatives.
        $pattern .= ')';                  #  End host alternatives.
        $pattern .= '([\w-]{11})';        # 11 characters (Length of Youtube video ids).
        $pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.
        preg_match($pattern, $url, $matches);
        return (isset($matches[1])) ? $matches[1] : false;
    }
    
  4. ==============================

    4.나는 리더 답에서 정규 표현식을 완성했다. 또한 다양한 URL에서 ID를 가져 오지만보다 정확하게 설명합니다.

    나는 리더 답에서 정규 표현식을 완성했다. 또한 다양한 URL에서 ID를 가져 오지만보다 정확하게 설명합니다.

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

    또한 잘못된 ID (11 자 이상)를 올바르게 처리합니다.

    http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF

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

    5.용도

    용도

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

    6.슬래시 문자에서 벗어나는 것을 잊었습니다. 그래서이 사람이해야 할 일 :

    슬래시 문자에서 벗어나는 것을 잊었습니다. 그래서이 사람이해야 할 일 :

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

    7.BBcode (https://developers.google.com/youtube/player_parameters#start)의 시작 매개 변수를 구문 분석합니다.

    BBcode (https://developers.google.com/youtube/player_parameters#start)의 시작 매개 변수를 구문 분석합니다.

    예 : [yt] http://www.youtube.com/watch?v=G059ou-7wmo#t=58 [/ yt]

    PHP 정규식 :

    '#\[yt\]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-]*(t=(\d+))?\[/yt\]#Uim'
    

    바꾸다:

    '<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'
    
  8. ==============================

    8.나는 PHP 오류를 직접적으로 다루는 사람을 보지 못 했으므로 설명하려고 노력할 것이다.

    나는 PHP 오류를 직접적으로 다루는 사람을 보지 못 했으므로 설명하려고 노력할 것이다.

    "Unknown modifier '['"오류의 원인은 구분 기호로 정규식을 감싸는 것을 잊었 기 때문입니다. PHP는 영숫자가 아닌 공백이 아닌 ASCII 문자 인 한 첫 번째 문자를 구분 기호로 사용합니다. 그래서 정규 표현식에서 :

    preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
    

    PHP는 여러분이 (시작 구분자로) 다음을 의미한다고 생각합니다. 다음은 닫는 구분자로 생각합니다. 다음은 패턴 수정 자입니다. 그러나 첫 번째 패턴 수정 자, 첫 번째 다음 문자)가 [. [분명히 유효한 패턴 변경자가 아니기 때문에 당신이하는 오류가 발생합니다.

    해결 방법은 단순히 구분 기호로 정규 표현식을 래핑하고 문자 그대로 일치시키려는 정규식 내의 구분 기호를 이스케이프 처리합니다. 구분 기호로 ~를 사용하고 싶습니다. b / c 정규 표현식에서 문자 그대로 ~와 일치시킬 필요는 거의 없습니다.

  9. ==============================

    9.아래 코드를 사용하십시오.

    아래 코드를 사용하십시오.

    $url = "" // here is url of youtube video
    $pattern = getPatternFromUrl($url); //this will retun video id
    
    function getPatternFromUrl($url)
    {
    $url = $url.'&';
    $pattern = '/v=(.+?)&+/';
    preg_match($pattern, $url, $matches);
    //echo $matches[1]; die;
    return ($matches[1]);
    }
    
  10. ==============================

    10.이것은 나를 위해 일했다.

    이것은 나를 위해 일했다.

    $yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla';
    
    $videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url));
    
  11. from https://stackoverflow.com/questions/2936467/parse-youtube-video-id-using-preg-match by cc-by-sa and MIT license