URL-адресу відео YouTube можна зустріти в різних форматах:
- останній короткий формат:
http://youtu.be/NLqAF9hrVbY
- iframe:
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.
І ось версія JavaScript з точно таким самим регулярним виразом (з видаленими коментарями):
// 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>');
}
Примітки:
- VIDEO_ID частина URL захоплюється в групі один і тільки захоплення:
$1
.
- Якщо ви знаєте, що ваш текст не містить жодних заздалегідь зв’язаних URL-адрес, ви можете безпечно видалити негативне твердження про пошук, яке перевіряє цю умову (Твердження, що починається з коментаря: «Затвердити URL-адресу не попередньо пов’язану». ) Це прискорить дещо збільшити регулярний вираз.
- Рядок заміни можна модифікувати відповідно. Один Наведені вище просто створює посилання на загальний
"http://www.youtube.com/watch?v=VIDEO_ID"
URL стилю і задає текст посилання на: "YouTube link: VIDEO_ID"
.
Редагувати 05.07.2011: Додано -
дефіс до класу ID char
Редагувати 17.07.2011: Виправлено регулярний вираз для споживання будь-якої залишкової частини (наприклад, запиту ) URL-адреси за ідентифікатором YouTube. Додано модифікатор 'i'
ігнорування регістру . Перейменовано функцію на camelCase. Покращений попередньо зв’язаний тест lookahead.
Редагувати 27.07.2011: Додано нові формати URL-адрес YouTube "user" та "ytscreeningroom".
Редагувати 02.08.2011: спрощений / узагальнений для обробки нових URL-адрес YouTube "що-небудь / щось / йде".
Редагувати 25.08.2011: Кілька модифікацій:
- Додано Javascript-версію
linkifyYouTubeURLs()
функції :.
- У попередній версії частина схеми (протокол HTTP) була необов’язковою і, таким чином, відповідала б недійсним URL-адресам. Зробив необхідну частину схеми.
- Попередня версія використовувала
\b
прив'язку межі слова навколо VIDEO_ID. Однак це не спрацює, якщо VIDEO_ID починається або закінчується -
тире. Виправлено так, що він справляється з цією умовою.
- Змінено вираз VIDEO_ID таким чином, що він повинен мати рівно 11 символів.
- Попередня версія не змогла виключити попередньо зв’язані URL-адреси, якщо вони мали рядок запиту, що слідує за VIDEO_ID. Покращено негативне твердження про пошук, щоб це виправити.
- Додано
+
та %
до рядка запиту, що відповідає класу символів.
- Змінений PHP версія регулярних виразів Обмежувач з:
%
до: ~
.
- Додано розділ "Нотатки" з деякими зручними нотатками.
Редагувати 12.10.2011: Частина хосту URL-адреси YouTube тепер може мати будь-який субдомен (не тільки www.
).
Редагувати 01.05.2012: Розділ URL-адреси споживання тепер може дозволити '-'.
Редагувати 23.08.2013: Додано додатковий формат, наданий @Mei. (Частина запиту може мати .
крапку.
Редагування 2013-11-30: долучення додатковий формат забезпечується @CRONUS: youtube-nocookie.com
.
Редагувати 25.01.2016: Виправлено регулярний вираз для обробки випадків помилок, наданих CRONUS.