Bagaimana cara menemukan semua id video YouTube dalam string menggunakan regex?

92

Saya memiliki bidang teks tempat pengguna dapat menulis apa saja.

Sebagai contoh:

Lorem Ipsum hanyalah teks tiruan. http://www.youtube.com/watch?v=DUQi_R4SgWo dari industri pencetakan dan penyusunan huruf. Lorem Ipsum telah menjadi teks tiruan standar industri sejak tahun 1500-an, ketika printer yang tidak dikenal menggunakan galai jenis dan mengacaknya untuk membuat buku jenis spesimen. Ini telah bertahan tidak hanya lima abad, tetapi juga lompatan ke dalam penyusunan huruf elektronik, tetap pada dasarnya tidak berubah. http://www.youtube.com/watch ?

Sekarang saya ingin mengurai dan menemukan semua URL video YouTube dan idnya.

Tahu bagaimana cara kerjanya?

n00b
sumber

Jawaban:

291

URL video YouTube dapat ditemukan dalam berbagai format:

  • format pendek terbaru: http://youtu.be/NLqAF9hrVbY
  • iframe: http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe (aman): https://www.youtube.com/embed/NLqAF9hrVbY
  • objek param: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • objek tersemat: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • menonton: http://www.youtube.com/watch?v=NLqAF9hrVbY
  • pengguna: http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
  • ytscreeningroom: http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
  • apapun itu!: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • / subdomain / juga: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • parameter lainnya: http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
  • kueri mungkin memiliki titik: http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
  • domain nocookie: http://www.youtube-nocookie.com

Berikut adalah fungsi PHP dengan ekspresi reguler yang dikomentari yang cocok dengan masing-masing formulir URL ini dan mengubahnya menjadi tautan (jika belum ada tautan):

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

; // Akhiri $ YouTubeId.

Dan berikut adalah versi JavaScript dengan regex yang sama persis (dengan komentar dihapus):

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

Catatan:

  • Bagian VIDEO_ID dari URL ditangkap pada kelompok satu dan hanya capture: $1.
  • Jika Anda mengetahui bahwa teks Anda tidak berisi URL yang telah ditautkan sebelumnya, Anda dapat dengan aman menghapus pernyataan lookahead negatif yang menguji kondisi ini (Penegasan dimulai dengan komentar: "Tegaskan URL tidak ditautkan sebelumnya." ) Ini akan mempercepat naikkan ekspresi reguler.
  • Tali pengganti dapat dimodifikasi agar sesuai. Yang disediakan di atas hanya menciptakan link ke generik "http://www.youtube.com/watch?v=VIDEO_ID"URL gaya dan menetapkan teks link: "YouTube link: VIDEO_ID".

Edit 2011-07-05: Menambahkan -tanda hubung ke kelas ID char

Edit 2011-07-17: Memperbaiki regex untuk menggunakan bagian yang tersisa (mis. Kueri ) dari URL setelah ID YouTube. Menambahkan pengubah 'i' kasus pengabaian . Berganti nama menjadi fungsi camelCase. Peningkatan tes lookahead pra-link.

Edit 2011-07-27: Menambahkan format "pengguna" dan "ytscreeningroom" baru dari URL YouTube.

Sunting 2011-08-02: Disederhanakan / digeneralisasikan untuk menangani URL YouTube "any / thing / goes" baru.

Sunting 2011-08-25: Beberapa modifikasi:

  • Menambahkan versi Javascript: linkifyYouTubeURLs()function.
  • Versi sebelumnya memiliki bagian skema (protokol HTTP) opsional dan karenanya akan cocok dengan URL yang tidak valid. Membuat bagian skema yang dibutuhkan.
  • Versi sebelumnya menggunakan \bkata jangkar batas di sekitar VIDEO_ID. Namun, ini tidak akan berfungsi jika VIDEO_ID diawali atau diakhiri dengan -tanda hubung. Diperbaiki sehingga menangani kondisi ini.
  • Mengubah ekspresi VIDEO_ID sehingga panjangnya harus tepat 11 karakter.
  • Versi sebelumnya gagal mengecualikan URL yang telah ditautkan sebelumnya jika mereka memiliki string kueri setelah VIDEO_ID. Meningkatkan pernyataan kepala penampil negatif untuk memperbaikinya.
  • Ditambahkan +dan %ke string kueri pencocokan kelas karakter.
  • Berubah versi PHP regex pembatas dari: %ke: ~.
  • Menambahkan bagian "Catatan" dengan beberapa catatan praktis.

Sunting 2011-10-12: Bagian host URL YouTube sekarang dapat memiliki subdomain apa pun (tidak hanya www.).

Sunting 2012-05-01: Bagian URL konsumsi sekarang memungkinkan untuk '-'.

Edit 2013-08-23: Menambahkan format tambahan yang disediakan oleh @Mei. (Bagian kueri mungkin memiliki .titik.

Mengedit 2013/11/30: Ditambahkan Format tambahan yang disediakan oleh @CRONUS: youtube-nocookie.com.

Edit 2016-01-25: Memperbaiki regex untuk menangani kasus kesalahan yang disediakan oleh CRONUS.

ridgerunner
sumber
2
Saya belum melihat spesifikasinya, meskipun saya sudah mencarinya. Saya baru saja melihat tanda hubung di beberapa tautan di belantara internet. Misalnya: youtube.com/watch?v=CLPk-6_xgiY
cottonBallPaws
1
@littleFluffyKitty: Terima kasih atas perhatiannya. Telah memperbarui jawaban untuk menyertakan tanda hubung sebagai karakter ID yang valid.
ridgerunner
1
@ridgerunner: Jika Anda tidak yakin dengan hasil edit, Anda dapat memutar kembali. Selain itu seperti di wikipedia seluruh sejarah disimpan dengan kredit Anda. Saya telah melihat Anda benar-benar berkebun jawabannya dari waktu ke waktu, jadi sayang untuk kehilangan Anda di sini.
hakre
1
Ini salah satu yang tidak berfungsi: youtube.com/watch?v=E1IPnnttL9k&feature=youtu.be
andrebola
1
Ini berfungsi dengan baik, tetapi gagal dengan parameter querystring (baru?) Ini: feature = youtu.be. Mengubah [? = & +% \ W -] * menjadi [? = & +% \ W - \.] * Pada baris "konsumsi url yang tersisa" akan berhasil. Terima kasih!
Mei Gwilym
10

Inilah metode yang pernah saya tulis untuk proyek yang mengekstrak kunci video YouTube dan 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. Temukan regex yang akan mengekstrak semua tautan dari teks. Google akan membantu Anda di sana.
  2. Ulangi semua tautan dan panggil getHostInfo () untuk masing-masing tautan
Christof
sumber
1
Terima kasih banyak! mod kecil if(strpos($vid_link, 'youtu'))akan menangkap url pendek youtu.beselain url umum.
Chamilyan
sama-sama. terima kasih atas pembaruannya, saya mengedit dalam perubahan. di samping catatan, regex ridgerunner tampaknya menjadi real deal dan saya merekomendasikan menggunakannya untuk hal sederhana saya. cheers
Christof
persis apa yang saya cari. tepat sobat! +1
blackpla9ue
8

Sementara jawaban ridgerunner adalah dasar untuk jawaban saya, jawaban ini TIDAK menyelesaikan semua url dan saya tidak percaya itu mampu melakukannya, karena beberapa kemungkinan kecocokan VIDEO_IDdalam URL YouTube. Regex saya menyertakan pendekatan agresifnya sebagai upaya terakhir, tetapi mencoba semua pencocokan umum terlebih dahulu, sangat mengurangi kemungkinan kecocokan yang salah nanti di URL.

Regex ini:

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

Menangani semua kasus yang awalnya direferensikan dalam contoh ridgerunners, ditambah url apa pun yang mungkin kebetulan memiliki urutan 11 karakter kemudian di url. yaitu:

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

Berikut adalah contoh yang berfungsi yang menguji semua contoh url YouTube:

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

ezwrighter
sumber
2

Mencoba

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

Anda akan menemukan ID video di grup pengambilan pertama. Yang tidak saya ketahui adalah apa itu ID Video yang valid? Saat ini saya memeriksa v=dan menangkap semua -A-Za-z0-9_.

Saya memeriksanya secara online di sini di rubular dengan string sampel Anda.

stema
sumber
2

Menggunakan:

<?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
?>
Noor Khan
sumber
2

Oke, saya membuat fungsi sendiri. Tapi saya yakin ini sangat tidak efisien. Setiap peningkatan diterima:

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;
}
n00b
sumber
Jika Anda hanya mencari tautan dari youtube.com, mengapa Anda awalnya ingin membuat daftar dengan semua tautan? Dan menurut saya tidak perlu menggunakan 3 regex yang berbeda.
stema
1

Saya mencoba ekspresi sederhana untuk hanya mendapatkan videoid:

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

Periksa apakah berfungsi secara online di sini di phpliveregex .

BL Praveen
sumber
1

Pengepos asli bertanya "Saya ingin mengurai dan menemukan semua URL video YouTube dan id-nya." Saya mengganti jawaban paling populer di atas ke preg_match dan mengembalikan id video dan URL.

Dapatkan URL dan ID YouTube dari postingan:

$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;
}
Lee Woodman
sumber
0

Temukan tautan YouTube dengan mudah dari string:

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)
Mukesh Kumar Bijarniya
sumber
Ini bukan hanya untuk YoutTube, ini akan mencocokkan url lain dari konten.
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);

    }

Kode di java ini berfungsi dengan baik untuk semua url youtube saat ini.

Sravya Singh
sumber