2012-03-07 16 views
8

एक उदाहरण के रूप में इन यूआरएल लेते हैं:RegEx पैटर्न किसी भी यूट्यूब यूआरएल से यूट्यूब वीडियो आईडी प्राप्त करने के लिए

  1. http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player
  2. http://www.youtube.com/watch?v=8GqqjVXhfMU

यह पीएचपी समारोह नहीं ठीक से आईडी प्राप्त करेंगे मामला 1, लेकिन मामले में 2. केस 1 बहुत आम है, जहां यूट्यूब आईडी के पीछे कुछ भी आ सकता है।

/** 
* get YouTube video ID from URL 
* 
* @param string $url 
* @return string YouTube video id or FALSE if none found. 
*/ 
function youtube_id_from_url($url) { 
    $pattern = 
     '%^# Match any YouTube URL 
     (?:https?://)? # Optional scheme. Either http or https 
     (?:www\.)?  # Optional www subdomain 
     (?:    # Group host alternatives 
      youtu\.be/ # Either youtu.be, 
     | youtube\.com # or youtube.com 
      (?:   # Group path alternatives 
      /embed/  # Either /embed/ 
      | /v/   # or /v/ 
      | /watch\?v= # or /watch\?v= 
     )    # End path alternatives. 
     )    # End host alternatives. 
     ([\w-]{10,12}) # Allow 10-12 for 11 char YouTube id. 
     $%x' 
     ; 
    $result = preg_match($pattern, $url, $matches); 
    if (false !== $result) { 
     return $matches[1]; 
    } 
    return false; 
} 

क्या मैं सोच रहा हूँ कि वहाँ एक रास्ता है, जहां मैं सिर्फ "v =" कोई फर्क नहीं पड़ता है जहाँ यह यूआरएल में निहित है के लिए देख सकते हैं, और उसके बाद वर्ण ले होना चाहिए है। इस तरह, कोई जटिल RegEx की आवश्यकता नहीं होगी। क्या यह आधार बंद है? अंक शुरू करने के लिए कोई विचार?

+0

मुझे लगता है कि इस पैटर्न के साथ मुख्य समस्या केवल पैटर्न के अंत में $ $ है, जो स्ट्रिंग के परीक्षण के अंत में पैटर्न को एंकर करती है। यही कारण है कि केस 1 मेल नहीं खाता है, क्योंकि यह आईडी के साथ समाप्त नहीं होता है। – Bendoh

उत्तर

27
if (preg_match('/youtube\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) { 
    $values = $id[1]; 
} else if (preg_match('/youtube\.com\/embed\/([^\&\?\/]+)/', $url, $id)) { 
    $values = $id[1]; 
} else if (preg_match('/youtube\.com\/v\/([^\&\?\/]+)/', $url, $id)) { 
    $values = $id[1]; 
} else if (preg_match('/youtu\.be\/([^\&\?\/]+)/', $url, $id)) { 
    $values = $id[1]; 
} 
else if (preg_match('/youtube\.com\/verify_age\?next_url=\/watch%3Fv%3D([^\&\?\/]+)/', $url, $id)) { 
    $values = $id[1]; 
} else { 
// not an youtube video 
} 

यह वही है मैं एक यूट्यूब URL से ID को निकालने के लिए इस्तेमाल करते हैं। मुझे लगता है कि यह सभी मामलों में काम करता है।

ध्यान दें कि अंत $ मूल्यों पर = वीडियो

+1

के साथ काम नहीं करता है यह बहुत अधिक सामान्य है और आप यूआरएल से प्राप्त यूआरएल फॉर्मों की विविधता को पकड़ता है। +1 – Bendoh

+0

@ बेंडोह यह चयनित उत्तर w/'parse_str' से अधिक सामान्य क्यों है - ऐसा लगता है जैसे यह यूआरएल में हर चर को पूरी तरह से पकड़ता है? – Shackrock

+1

चयनित उत्तर फॉर्म/v/ या एम्बेड/ के URL को कैप्चर नहीं करेगा, केवल वह फ़ॉर्म जिसमें क्वेरी v पैरामीटर के रूप में 'v' है। यह लिंक के होस्टनाम पर भी ध्यान नहीं देता है - यह सिर्फ क्वेरी स्ट्रिंग में 'v' पैरामीटर वाले किसी भी URL से 'v' के मान को खींचने जा रहा है। उदाहरण के लिए, http://www.youtube.com/v/ihCbVT637aM सही ढंग से पार्स नहीं किया जाएगा। – Bendoh

2

तुम बस parse_url और parse_str इस्तेमाल कर सकते हैं:

$query_string = parse_url($url, PHP_URL_QUERY); 
parse_str($query_string); 
echo $v; 
0

एक और आसान तरीका parse_str() उपयोग कर रहा है:

<?php 
    $url = 'http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player'; 
    parse_str($url, $yt); 

    // The associative array $yt now contains all of the key-value pairs from the querystring (along with the base 'watch' URL, but doesn't seem you need that) 
    echo $yt['v']; // echos '8GqqjVXhfMU'; 
?> 
+0

ऐसा लगता है कि आप पहले उत्तर राज्य के रूप में parse_url गायब हैं। Parse_url के साथ यह काम करता है। एफवाईआई – Shackrock

+0

[ओआरआईजी: parse_url की कोई ज़रूरत नहीं है। कोई तर्क दे सकता है कि यह क्लीनर है, लेकिन - कम से कम PHP 5.3.6 में - क्वेरीस्ट्रिंग पैरामीटर से पहले यूआरएल सरणी में एक कुंजी है।] - संपादित करें: आह मानें, यह तब काम करता है जब केवल एक क्यूएस पैरामीटर होता है, लेकिन फ़ंक्शन & पर विभाजित होना चाहिए। parse_url अधिक सही तरीका होगा। – Morgon

9
regex के बजाय

। मैं hightly parse_url() और parse_str() की सिफारिश:

$url = "http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player"; 
parse_str(parse_url($url, PHP_URL_QUERY), $vars); 
echo $vars['v'];  

हो गया

+0

बिल्कुल सही। धन्यवाद। – Shackrock

+2

यह https://www.youtube.com/v/qfx6yf8pux4 –

0

parse_url सुझाव अच्छे हैं। क्या तुम सच में एक regex चाहते हैं तो आप इस का उपयोग कर सकते हैं:

/(?<=v=)[^&]+/` 
0

मैं निम्नलिखित पैटर्न का इस्तेमाल किया है क्योंकि यूट्यूब एक youtube-nocookie.com डोमेन भी है की पहचान:

'@youtube(?:-nocookie)?\.com/watch[#\?].*?v=([^"\& ]+)@i', 
'@youtube(?:-nocookie)?\.com/embed/([^"\&\? ]+)@i', 
'@youtube(?:-nocookie)?\.com/v/([^"\&\? ]+)@i', 
'@youtube(?:-nocookie)?\.com/\?v=([^"\& ]+)@i', 
'@youtu\.be/([^"\&\? ]+)@i', 
'@gdata\.youtube\.com/feeds/api/videos/([^"\&\? ]+)@i', 

अपने मामले में यह होता में आप अपने प्रस्तावित अभिव्यक्ति को बदलते हैं नहीं शामिल करने के लिए

if (preg_match('/youtube(?:-nocookie)\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) { 

: केवल इसलिए की तरह नियमित रूप से YouTube.com URL के लिए वैकल्पिक (-nocookie) के साथ मौजूदा भाव का विस्तार करने का मतलब अंतिम $, यह आपके इरादे की तरह काम करना चाहिए। मैंने -नोकूकी भी जोड़ा। कोई YouTube लिंक के लिए

/** 
* get YouTube video ID from URL 
* 
* @param string $url 
* @return string YouTube video id or FALSE if none found. 
*/ 
function youtube_id_from_url($url) { 
    $pattern = 
     '%^# Match any YouTube URL 
     (?:https?://)? # Optional scheme. Either http or https 
     (?:www\.)?  # Optional www subdomain 
     (?:    # Group host alternatives 
      youtu\.be/ # Either youtu.be, 
     |youtube(?:-nocookie)?\.com # or youtube.com and youtube-nocookie 
      (?:   # Group path alternatives 
      /embed/  # Either /embed/ 
      | /v/   # or /v/ 
      | /watch\?v= # or /watch\?v= 
     )    # End path alternatives. 
     )    # End host alternatives. 
     ([\w-]{10,12}) # Allow 10-12 for 11 char YouTube id. 
     %x' 
     ; 
    $result = preg_match($pattern, $url, $matches); 
    if (false !== $result) { 
     return $matches[1]; 
    } 
    return false; 
} 
0

यहाँ एक समाधान

/** 
* credits goes to: http://stackoverflow.com/questions/11438544/php-regex-for-youtube-video-id 
* update: mobile link detection 
*/ 
public function parseYouTubeUrl($url) 
{ 
    $pattern = '#^(?:https?://)?(?:www\.)?(?:m\.)?(?: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; 
} 

यह भी मोबाइल लिंक के साथ सौदा कर सकते हैं।

-1

यूट्यूब आईडी पुनर्प्राप्त करने के लिए मेरा कार्य यहां है!

function getYouTubeId($url) { 
    if (!(strpos($url, 'v=') !== false)) return false; 
    $parse = explode('v=', $url); 
    $code = $parse[1]; 
    if (strlen($code) < 11) return false; 
    $code = substr($code, 0, 11); 
    return $code; 
}