YouTube视频的URL可能以多种格式出现:
- 最新的短格式:
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
- 任意/thing/goes!:
http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
- 任意子域名/too:
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格式并将它们转换为链接(如果它们还不是链接):
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版本(已删除注释):
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,可以安全地删除否定前瞻断言,该断言测试此条件(以注释开头:“断言URL未预链接”)。这将加快正则表达式的速度。
- 替换字符串可以修改以适应。上面提供的只是创建链接到通用
"http://www.youtube.com/watch?v=VIDEO_ID"
风格URL并将链接文本设置为:"YouTube link: VIDEO_ID"
。
编辑2011-07-05:在ID字符类中添加了-
连字符
编辑2011-07-17:修复了正则表达式以消耗遵循YouTube ID的URL的任何剩余部分(例如查询)。添加了'i'
忽略大小写修饰符。将函数重命名为camelCase。改进了预链接的前瞻测试。
编辑2011-07-27:添加了新的“用户”和“ytscreeningroom”格式的YouTube URL。
编辑2011-08-02:简化/概括以处理新的“任何/事情/走”YouTube URL。
编辑2011-08-25:进行了几个修改:
- 添加了
linkifyYouTubeURLs()
函数的JavaScript版本。
- 先前的版本使方案(HTTP协议)部分可选,因此会匹配无效的URL。将方案部分设为必需。
- 以前的版本在VIDEO_ID周围使用了\b单词边界锚定符号。但是,如果VIDEO_ID以
-
破折号开头或结尾,则无法使用该符号。修复以处理此条件。
- 更改VIDEO_ID表达式,使其必须正好为11个字符长。
- 以前的版本未排除具有VIDEO_ID后跟查询字符串的预链接URL。改进了否定前瞻断言以解决此问题。
- 将“+”和“%”添加到与查询字符串匹配的字符类。
- 将PHP版本的正则表达式分隔符从
%
更改为~
。
- 添加了一个“注意事项”部分,其中包含一些方便的说明。
编辑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提供的错误情况所示的正则表达式。