Bir normal ifade kullanarak bir dizedeki tüm YouTube video kimliklerini nasıl bulabilirim?


93

Kullanıcıların her şeyi yazabileceği bir metin alanım var.

Örneğin:

Lorem Ipsum, basit bir metindir. http://www.youtube.com/watch?v=DUQi_R4SgWo baskı ve dizgi endüstrisi. Lorem Ipsum, bilinmeyen bir matbaacının bir dizi çeşidi alıp bir tür numune kitabı yapmak için karıştırdığı 1500'lerden beri endüstrinin standart kukla metni olmuştur. Sadece beş yüzyıl boyunca değil, aynı zamanda elektronik dizgiye sıçradı ve esasen değişmeden kaldı. http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu 1960'larda Lorem Ipsum pasajlarını içeren Letraset sayfalarının yayınlanmasıyla ve yakın zamanda Aldus PageMaker gibi Lorem Ipsum sürümleri de dahil olmak üzere masaüstü yayıncılık yazılımlarıyla popüler hale geldi.

Şimdi onu ayrıştırmak ve tüm YouTube video URL'lerini ve kimliklerini bulmak istiyorum.

Nasıl çalıştığına dair bir fikrin var mı?


Yanıtlar:


292

Bir YouTube video URL'si çeşitli biçimlerde karşılaşılabilir:

  • en son kısa biçim: http://youtu.be/NLqAF9hrVbY
  • iframe: http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe (güvenli): https://www.youtube.com/embed/NLqAF9hrVbY
  • nesne parametresi: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • nesne yerleştirme: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • izlemek: http://www.youtube.com/watch?v=NLqAF9hrVbY
  • kullanıcılar: http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
  • ytscreeningroom: http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
  • herhangi / şey / gider !: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • herhangi / alt alan / çok: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • daha fazla parametre: http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
  • sorguda nokta olabilir: http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
  • nocookie alan adı: http://www.youtube-nocookie.com

Burada, bu URL formlarının her biriyle eşleşen ve bunları bağlantılara dönüştüren (zaten bağlantı değillerse), yorumlanmış bir normal ifadeye sahip bir PHP işlevi verilmiştir:

// 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'yi sonlandırın.

Ve işte tam olarak aynı normal ifadeye sahip bir JavaScript sürümü (yorumlar kaldırılmış):

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

Notlar:

  • URL VIDEO_ID kısmı ve tek çekim grubunda yakalanır: $1.
  • Metninizin önceden bağlanmış herhangi bir URL içermediğini biliyorsanız, bu koşulu test eden olumsuz önden okuma iddiasını güvenli bir şekilde kaldırabilirsiniz ( "URL iddiası önceden bağlanmamış" yorumuyla başlayan iddia ) Bu hızlanacaktır. normal ifadeyi biraz artırın.
  • Değiştirme dizisi uygun şekilde değiştirilebilir. Yukarıda verilen tek basitçe jenerik bir bağlantı oluşturur "http://www.youtube.com/watch?v=VIDEO_ID"stil URL ve bağlantı metni ayarlar: "YouTube link: VIDEO_ID".

Düzenleme 2011-07-05:- Kimlik karakter sınıfına kısa çizgi eklendi

Düzenleme 2011-07-17: YouTube Kimliğini izleyen URL'nin kalan kısmını (örneğin, sorgu ) tüketmesi için normal ifade düzeltildi . Eklenen 'i' göz ardı durum değiştiricisi. İşlev camelCase olarak yeniden adlandırıldı. Geliştirilmiş önceden bağlantılı önden okuma testi.

Düzenleme 2011-07-27: YouTube URL'lerine yeni "kullanıcı" ve "ytscreeningroom" biçimleri eklendi.

Düzenleme 2011-08-02: Yeni "her şey / her şey" YouTube URL'lerini işlemek için basitleştirilmiş / genelleştirilmiş.

Düzenleme 2011-08-25: Çeşitli değişiklikler:

  • : linkifyYouTubeURLs()Function'ın Javascript sürümü eklendi .
  • Önceki sürümde şema (HTTP protokolü) kısmı isteğe bağlıydı ve bu nedenle geçersiz URL'lerle eşleşiyordu. Şema bölümünü gerekli yaptı.
  • Önceki sürüm \b, VIDEO_ID'nin etrafında kelime sınırını kullandı . Ancak, VIDEO_ID -kısa çizgi ile başlar veya biterse bu çalışmayacaktır . Bu durumu idare etmesi için düzeltildi.
  • VIDEO_ID ifadesi tam olarak 11 karakter uzunluğunda olacak şekilde değiştirildi.
  • Önceki sürüm, VIDEO_ID'yi izleyen bir sorgu dizesine sahiplerse, önceden bağlanmış URL'leri hariç tutamadı. Bunu düzeltmek için olumsuz önden okuma iddiası iyileştirildi.
  • Sorgu dizesiyle eşleşen karakter sınıfına +ve eklendi %.
  • PHP sürümü normal ifade ayırıcısı: %yerine a: olarak değiştirildi ~.
  • Bazı kullanışlı notlar içeren bir "Notlar" bölümü eklendi.

Düzenleme 2011-10-12: YouTube URL ana makine bölümü artık herhangi bir alt etki alanına sahip olabilir (yalnızca değil www.).

Düzenleme 2012-05-01: URL tüket bölümü artık "-" karakterine izin verebilir.

Edit 2013-08-23: @Mei tarafından sağlanan ek format eklendi. (Sorgu kısmında bir .nokta olabilir .

Düzenleme 2013/11/30: @CRONUS tarafından sağlanan eklendi ek formatı: youtube-nocookie.com.

Düzenleme 2016-01-25: CRONUS tarafından sağlanan hata durumunu işlemek için normal ifade düzeltildi.


2
Birini aradım ama bir özellik görmedim. İnternetin vahşi doğasındaki bazı bağlantılarda kısa çizgi fark ettim. Örneğin: youtube.com/watch?v=CLPk-6_xgiY
cottonBallPaws

1
@littleFluffyKitty: Uyarılar için teşekkürler. Yanıtı kısa çizgiyi geçerli bir kimlik karakteri olarak içerecek şekilde güncellediniz.
ridgerunner

1
@ridgerunner: Bir düzenlemeden emin değilseniz, geri alabilirsiniz. Ek olarak, Wikipedia'da olduğu gibi, tüm tarih kredilerinizle saklanır. Zamanla cevabı gerçekten bahçeye aldığını gördüm, bu yüzden seni burada kaybetmek çok yazık olur.
hakre

1
İşte işe yaramayan bir tanesi: youtube.com/watch?v=E1IPnnttL9k&feature=youtu.be
andrebola

1
Bu harika çalışıyor, ancak bu (yeni?) Querystring parametresiyle başarısız oluyor: feature = youtu.be. "Kalan url'yi tüket" satırınızda [? = & +% \ W -] * 'yi [? = & +% \ W - \.] * Olarak değiştirmek işe yarar. Teşekkürler!
Mei Gwilym

10

İşte bir zamanlar YouTube ve Vimeo video anahtarlarını çıkaran bir proje için yazdığım bir yöntem:

/**
 *  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. Bir metinden tüm bağlantıları çıkaracak bir normal ifade bulun. Google size orada yardımcı olacaktır.
  2. Tüm bağlantıları döngüleyin ve her biri için getHostInfo () öğesini çağırın

1
çok teşekkürler! hafif mod , ortak url'lere ek olarak if(strpos($vid_link, 'youtu'))kısa url'yi de yakalayacaktır youtu.be.
Chamilyan

rica ederim. güncelleme için teşekkürler, değişikliği düzenledim. bir yan notta, ridgerunner'ın normal ifadesi gerçek bir anlaşma gibi görünüyor ve basit şeyim yerine onu kullanmanızı öneririm. şerefe
Christof

tam olarak aradığım şey. dostum! +1
blackpla9ue

8

Ridgerunner'ın cevabı cevabımın temeli olsa da, onun tüm url'leri ÇÖZMEZ VIDEO_IDve bir YouTube URL'sindeki birden fazla olası eşleşme nedeniyle bunu yapabileceğine inanmıyorum . Normal ifadem, son çare olarak agresif yaklaşımını içerir, ancak önce tüm ortak eşleşmeleri dener ve daha sonra URL'de yanlış eşleşme olasılığını büyük ölçüde azaltır.

Bu normal ifade:

/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 örneklerinde orijinal olarak referans verilen tüm durumları ve ayrıca url'de daha sonra 11 karakterlik bir diziye sahip olabilecek herhangi bir url'yi ele alır. yani:

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

İşte tüm örnek YouTube URL'lerini test eden çalışan bir örnek:

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


2

Deneyin

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

Video kimliklerini ilk çekim grubunda bulacaksınız. Bilmediğim şey, geçerli bir Video Kimliğinin ne olduğu? Şu anda kontrol ediyorum v=ve hepsini çekiyorum -A-Za-z0-9_.

Örnek dizinizle birlikte burada çevrimiçi olarak kontrol ettim .


2

Kullanım:

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

Tamam, kendime ait bir işlev yaptım. Ama oldukça verimsiz olduğuna inanıyorum. Herhangi bir iyileştirmeye açığız:

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

Yalnızca youtube.com'dan bağlantılar arıyorsanız, neden önce tüm bağlantıların bulunduğu bir liste oluşturmak istiyorsunuz? Ve 3 farklı normal ifade kullanmanın gerekli olmadığını düşünüyorum.
stema


1

Orijinal gönderen "Bunu ayrıştırmak ve tüm YouTube video URL'lerini ve kimliklerini bulmak istiyorum" diye sordu. Yukarıdaki en popüler yanıtı preg_match olarak değiştirdim ve video kimliğini ve URL'sini döndürdüm.

Gönderiden YouTube URL'sini ve kimliğini alın:

$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

Bir dizeden kolayca bir YouTube bağlantısı bulun:

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)

Bu sadece YoutTube için değil, içerikteki diğer url'lerle eşleşecek.
Rahil Wazir

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

    }

Java'daki bu kod, şu anda tüm youtube url'leri için kesinlikle iyi çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.