URL video YouTube có thể gặp ở nhiều định dạng:
- định dạng ngắn mới nhất:
http://youtu.be/NLqAF9hrVbY
- iframe:
http://www.youtube.com/embed/NLqAF9hrVbY
- iframe (bảo mật):
https://www.youtube.com/embed/NLqAF9hrVbY
- đối tượng param:
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- đối tượng nhúng:
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- đồng hồ đeo tay:
http://www.youtube.com/watch?v=NLqAF9hrVbY
- người dùng:
http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
- ytscreeningroom:
http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
- bất kỳ / điều / đi !:
http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
- bất kỳ / tên miền phụ / quá:
http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
- các thông số khác:
http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
- truy vấn có thể có dấu chấm:
http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
- miền nocookie:
http://www.youtube-nocookie.com
Đây là một hàm PHP với regex được nhận xét phù hợp với từng dạng URL này và chuyển chúng thành liên kết (nếu chúng chưa phải là liên kết):
// 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;
}
; // Kết thúc $ YouTubeId.
Và đây là một phiên bản JavaScript với cùng một regex (với các nhận xét đã bị xóa):
// 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>');
}
Ghi chú:
- Phần VIDEO_ID của URL được chụp ở nhóm một và chỉ chụp:
$1
.
- Nếu bạn biết rằng văn bản của mình không chứa bất kỳ URL nào được liên kết trước, bạn có thể xóa một cách an toàn xác nhận phủ định trên trang đầu để kiểm tra điều kiện này (Xác nhận bắt đầu bằng nhận xét: "URL xác nhận không được liên kết trước" ). Điều này sẽ tăng tốc độ lên regex phần nào.
- Chuỗi thay thế có thể được sửa đổi cho phù hợp. Người cung cấp ở trên chỉ đơn giản là tạo ra một liên kết đến chung
"http://www.youtube.com/watch?v=VIDEO_ID"
URL phong cách và đặt link text: "YouTube link: VIDEO_ID"
.
Chỉnh sửa 2011-07-05: Đã thêm -
dấu gạch nối vào lớp ký tự ID
Chỉnh sửa 2011/07/17: Đã sửa lỗi regex để sử dụng bất kỳ phần nào còn lại (ví dụ: truy vấn ) của URL sau ID YouTube. Đã thêm 'i'
công cụ sửa đổi chữ hoa-thường . Đã đổi tên chức năng thành camelCase. Cải thiện kiểm tra trang đầu được liên kết trước.
Chỉnh sửa 2011/07/27: Đã thêm định dạng "người dùng" và "ytscreeningroom" mới của URL YouTube.
Chỉnh sửa 2011-08-02: Đơn giản hóa / tổng quát hóa để xử lý các URL YouTube "bất kỳ / điều gì / đi" mới.
Chỉnh sửa 2011-08-25: Một số sửa đổi:
- Đã thêm phiên bản Javascript của:
linkifyYouTubeURLs()
function.
- Phiên bản trước có phần lược đồ (giao thức HTTP) tùy chọn và do đó sẽ khớp với các URL không hợp lệ. Thực hiện phần chương trình bắt buộc.
- Phiên bản trước đã sử dụng ký tự liên kết
\b
ranh giới từ xung quanh VIDEO_ID. Tuy nhiên, điều này sẽ không hoạt động nếu VIDEO_ID bắt đầu hoặc kết thúc bằng -
dấu gạch ngang. Đã sửa để nó xử lý tình trạng này.
- Đã thay đổi biểu thức VIDEO_ID để biểu thức phải dài chính xác 11 ký tự.
- Phiên bản trước không thể loại trừ các URL được liên kết trước nếu chúng có chuỗi truy vấn theo sau VIDEO_ID. Đã cải tiến xác nhận tiêu cực để khắc phục điều này.
- Đã thêm
+
và %
vào chuỗi truy vấn phù hợp với lớp ký tự.
- Thay đổi phiên bản PHP regex delimiter từ:
%
đến a: ~
.
- Đã thêm phần "Ghi chú" với một số ghi chú hữu ích.
Chỉnh sửa 2011-10-12: Phần lưu trữ URL của YouTube hiện có thể có bất kỳ tên miền phụ nào (không chỉ www.
).
Chỉnh sửa 2012-05-01: Phần URL tiêu thụ bây giờ có thể cho phép '-'.
Chỉnh sửa 2013-08-23: Đã thêm định dạng bổ sung do @Mei cung cấp. (Phần truy vấn có thể có .
dấu chấm.
Sửa 2013/11/30: Thêm định dạng thêm được cung cấp bởi @CRONUS: youtube-nocookie.com
.
Chỉnh sửa 2016-01-25: Đã sửa lỗi regex để xử lý trường hợp lỗi do CRONUS cung cấp.