मैं एक रेगेक्स का उपयोग करके स्ट्रिंग में सभी YouTube वीडियो आईडी कैसे खोजूं?


91

मेरे पास एक टेक्स्टफील्ड है जहां उपयोगकर्ता कुछ भी लिख सकते हैं।

उदाहरण के लिए:

लोरेम ईपसुम बस डमी पाठ है। http://www.youtube.com/watch?v=DUQi_R4SgWo मुद्रण और टाइपिंग उद्योग। लोरम इप्सम 1500 के दशक के बाद से उद्योग का मानक डमी पाठ रहा है, जब एक अज्ञात प्रिंटर ने एक प्रकार की गली ली और इसे एक प्रकार की पुस्तक बनाने के लिए तराशा। यह न केवल पाँच शताब्दियों तक जीवित रहा है, बल्कि इलेक्ट्रॉनिक टंकण में भी छलांग लगाता है, शेष अनिवार्य रूप से अपरिवर्तित रहता है। http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu इसे 1960 के दशक में लोरम इप्सम मार्ग से युक्त लेट्रसेट शीट जारी करने के साथ लोकप्रिय किया गया था, और हाल ही में लोरम इप्सम के संस्करणों सहित एल्डस पेजमेकर जैसे डेस्कटॉप सॉफ़्टवेयर के साथ।

अब मैं इसे पार्स करना चाहता हूं और सभी YouTube वीडियो URL और उनकी आईडी ढूंढना चाहता हूं।

किसी भी विचार कैसे काम करता है?


जवाबों:


289

YouTube वीडियो URL का विभिन्न स्वरूपों में सामना किया जा सकता है:

  • नवीनतम लघु प्रारूप: http://youtu.be/NLqAF9hrVbY
  • आइफ्रेम: http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe (सुरक्षित): https://www.youtube.com/embed/NLqAF9hrVbY
  • वस्तु परम: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • ऑब्जेक्ट एम्बेड करें: 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
  • कुछ भी हो जाता!: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • किसी भी / उपडोमेन भी /: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • अधिक पैरा: 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

यहाँ एक टिप्पणी के साथ 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 समाप्त करें।

और यहाँ एक सटीक सटीक रेगेक्स (हटाए गए टिप्पणियों के साथ) एक जावास्क्रिप्ट संस्करण है:

// 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>');
}

टिप्पणियाँ:

  • URL का VIDEO_ID भाग एक और केवल कैप्चर समूह में कैप्चर किया गया है $1:।
  • यदि आप जानते हैं कि आपके पाठ में कोई पूर्व-लिंक किया गया URL नहीं है, तो आप इस स्थिति के लिए परीक्षण करने वाले नकारात्मक लुकहेड दावे को सुरक्षित रूप से निकाल सकते हैं (टिप्पणी के साथ शुरू होने वाला दावा: "Assert URL पूर्व-लिंक नहीं है।" ) यह गति देगा कुछ हद तक रेगेक्स।
  • प्रतिस्थापित स्ट्रिंग को सूट करने के लिए संशोधित किया जा सकता है। ऊपर दी गई एक बस सामान्य तक लिंक प्रदान करता "http://www.youtube.com/watch?v=VIDEO_ID"शैली यूआरएल और लिंक पाठ सेट: "YouTube link: VIDEO_ID"

2011-07-05 संपादित करें:- ID char class में हाइफ़न जोड़ा गया

2011-07-17 संपादित करें: YouTube आईडी के बाद URL के किसी भी शेष भाग (जैसे क्वेरी ) का उपभोग करने के लिए निश्चित रेगेक्स । जोड़ा गया 'i' -केस संशोधक। कैमलकेस को नाम दिया गया फ़ंक्शन। पहले से जुड़े हुए लुकहेड टेस्ट में सुधार हुआ।

2011-07-27 संपादित करें: YouTube URL के नए "उपयोगकर्ता" और "ytscreeningroom" प्रारूप जोड़े गए।

2011-08-02 संपादित करें: नए "किसी भी / चीज़ /" पर जाने के लिए सरलीकृत / सामान्यीकृत "YouTube URL"।

2011-08-25 संपादित करें: कई संशोधन:

  • का एक जावास्क्रिप्ट संस्करण जोड़ा: linkifyYouTubeURLs()समारोह।
  • पिछले संस्करण में स्कीम (HTTP प्रोटोकॉल) भाग वैकल्पिक था और इस तरह यह अमान्य URL से मेल खाएगा। योजना को आवश्यक हिस्सा बनाया।
  • पिछले संस्करण \bमें VIDEO_ID के चारों ओर सीमा एंकर शब्द का उपयोग किया गया था । हालाँकि, यह काम नहीं करेगा यदि VIDEO_ID -डैश के साथ शुरू या समाप्त होता है । निश्चित है कि यह इस स्थिति को संभालता है।
  • VIDEO_ID अभिव्यक्ति को बदल दिया ताकि यह ठीक 11 वर्ण लंबा हो।
  • पिछला संस्करण पूर्व-लिंक किए गए URL को बाहर करने में विफल रहा अगर उनके पास VIDEO_ID के बाद एक क्वेरी स्ट्रिंग था। इसे ठीक करने के लिए नकारात्मक रूपांतर परख में सुधार हुआ।
  • जोड़ा +और %चरित्र वर्ग मिलान क्वेरी स्ट्रिंग।
  • परिवर्तित PHP संस्करण regex सीमांकक से: %a ~:।
  • कुछ आसान नोट्स के साथ "नोट्स" अनुभाग जोड़ा गया।

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 द्वारा प्रदान की गई त्रुटि मामले को संभालने के लिए फिक्स्ड रेगेक्स।


2
मैंने एक युक्ति नहीं देखी है, हालांकि मैंने एक खोज की थी। मैंने अभी-अभी इंटरनेट के wilds में कुछ लिंक्स में डैश को देखा। उदाहरण के लिए: youtube.com/watch?v=CLPk-6_xgiY
cottonBallPaws

1
@littleFluffyKitty: सिर के लिए धन्यवाद। एक वैध आईडी चार के रूप में हाइफ़न को शामिल करने के उत्तर को अपडेट किया है।

1
@ridgerunner: यदि आप किसी संपादन से आश्वस्त नहीं हैं, तो आप रोल-बैक कर सकते हैं। इसके अलावा विकिपीडिया पर पूरे इतिहास को आपके क्रेडिट के साथ रखा गया है। मैंने देखा है कि आपने समय के साथ वास्तव में जवाब दिया है, इसलिए यह आपको यहाँ ढीला कर देगा।
हकर्रे

1
यहाँ एक काम नहीं किया गया है: youtube.com/watch?v=E1IPnttL9k&feature=youtu.be
andrebola

1
यह महान काम करता है, लेकिन इस (नए?) के साथ विफल होता है: परम = सुविधा = youtu.be। बदलना [? = & +% \ W -] * से [? = & +% \ W - \]। * अपने "शेष url का उपभोग करें" लाइन चाल करता है। धन्यवाद!
मेई ग्विल्म

10

यहां मैंने एक बार एक परियोजना के लिए लिखा था जो 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;
}
  1. एक rexx खोजें जो एक पाठ से सभी लिंक निकालेगा। गूगल वहां आपकी मदद करेगा।
  2. सभी लिंक को लूप करें और प्रत्येक के लिए getHostInfo () को कॉल करें

1
बहुत धन्यवाद! मामूली मॉड आम यूआरएल के अलावा if(strpos($vid_link, 'youtu'))छोटे यूआरएल पर कब्जा करेगा youtu.be
चामिलन

आपका स्वागत है। अपडेट के लिए धन्यवाद, मैंने बदलाव में संपादित किया। एक साइड नोट पर, राइडररनर का रेगेक्स वास्तविक सौदा प्रतीत होता है और मैं इसे अपनी सरल चीज़ पर उपयोग करने की सलाह देता हूं। चीयर्स
क्रिस्टोफ

ठीक वही जो मेरे द्वारा खोजा जा रहा था। दोस्त पर हाजिर! +1
ब्लैकप्ला

8

जबकि रेजरगनर का जवाब मेरे जवाब का आधार है, उसका यूआरएल सभी यूआरएल के लिए हल नहीं होता है और मुझे विश्वास नहीं होता कि यह VIDEO_IDYouTube 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;

मूल रूप से राइडर के उदाहरणों में संदर्भित सभी मामलों को संभालता है, साथ ही किसी भी यूआरएल को हो सकता है जो बाद में यूआरएल में 11 वर्ण अनुक्रम हो सकता है। अर्थात:

http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit

यहाँ एक कार्यशील नमूना है जो सभी नमूने का YouTube परीक्षण करता है:

http://jsfiddle.net/DJSwc/5/


2

प्रयत्न

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

आपको वीडियो आईडी 'पहले कैप्चरिंग ग्रुप में मिलेगी। मुझे नहीं पता कि एक वैध वीडियो आईडी क्या है? फिलहाल मैं v=सभी के लिए जांच करता हूं और कब्जा करता हूं -A-Za-z0-9_

मैंने इसे आपके नमूना स्ट्रिंग के साथ रबुलर पर यहां ऑनलाइन चेक किया ।


2

उपयोग:

<?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
?>

2

ठीक है, मैंने अपना एक फंक्शन बनाया। लेकिन मेरा मानना ​​है कि यह काफी अक्षम है। किसी भी सुधार का स्वागत है:

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;
}

यदि आप केवल youtube.com के लिंक की तलाश कर रहे हैं, तो आप सभी लिंक के साथ पहली सूची में क्यों बनाना चाहते हैं? और मुझे लगता है कि इसके 3 अलग-अलग रीजैक्स का उपयोग करना आवश्यक नहीं है।
स्टेमा


1

मूल पोस्टर ने पूछा "मैं इसे पार्स करना चाहता हूं और सभी YouTube वीडियो URL और उनकी आईडी ढूंढना चाहता हूं।" मैंने सबसे लोकप्रिय उत्तर को एक preg_match पर स्विच किया और वीडियो आईडी और 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;
}

0

एक स्ट्रिंग से आसानी से 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)

यह सिर्फ YoutTube के लिए नहीं है, यह सामग्री से अन्य यूआरएल से मेल खाएगा।
राहिल वज़ीर

0
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 यूआरएल के लिए बिल्कुल ठीक काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.