Php 如何使用正则表达式在字符串中查找所有YouTube视频ID?
我有一个文本字段,用户可以在其中写入任何内容 例如: Lorem Ipsum只是一个虚拟文本。 印刷排版技术 工业。Lorem Ipsum一直是 行业标准的虚拟文本 从16世纪开始,当一个未知的 印刷工拿起了一个打字和打印的厨房 把它搅乱做成一个标本 书。它不仅存活了五年 百年,更是一跃而成 电子排版,剩余 基本上没有变化。 它在20世纪60年代开始流行 Letraset表的发布 包含Lorem Ipsum段,以及 最近的桌面出版 像Aldus PageMaker这样的软件 包括Lorem Ipsum的版本 现在我想解析它并找到所有YouTube视频URL及其IDPhp 如何使用正则表达式在字符串中查找所有YouTube视频ID?,php,regex,youtube,Php,Regex,Youtube,我有一个文本字段,用户可以在其中写入任何内容 例如: Lorem Ipsum只是一个虚拟文本。 印刷排版技术 工业。Lorem Ipsum一直是 行业标准的虚拟文本 从16世纪开始,当一个未知的 印刷工拿起了一个打字和打印的厨房 把它搅乱做成一个标本 书。它不仅存活了五年 百年,更是一跃而成 电子排版,剩余 基本上没有变化。 它在20世纪60年代开始流行 Letraset表的发布 包含Lorem Ipsum段,以及 最近的桌面出版 像Aldus PageMaker这样的软件 包括Lorem Ip
知道这是怎么回事吗?我曾经为一个提取YouTube和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;
}
/**
*从任何视频链接中删除重要信息
*
*@param string链接到hosters页面上的视频
*@return失败时为假,成功时为数组
*/
函数getHostInfo($vid_link)
{
//YouTube获取视频id
if(STRPO($vid_link,'youtu'))
{
//常规链接
如果(preg_)匹配('/(?使用:
好吧,我自己做了一个函数。但我认为它效率很低。
欢迎任何改进:
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;
}
试一试
您将在第一个捕获组中找到视频ID。我不知道什么是有效的视频ID?此时我检查v=
并捕获所有-a-Za-z0-9
我用您的示例字符串在线检查了它。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
- 任何事情都会发生!:
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表单,并将它们转换为链接(如果它们还不是链接):
//链接尚未链接的youtube URL。
函数linkifyYouTubeURLs($text){
$text=preg_replace('~(?#!js YouTubeId版本:20160125_1800)
#在野外匹配未链接的youtube URL。(版本:20130823)
https?:/#必需的方案。http或https。
(?:[0-9A-Z-]+\)?#可选子域。
(?:#组主机备选方案。
youtu\.be/#或者youtu.be,
|youtube#或youtube.com或
(?:-nocookie)?#youtube-nocookie.com
\.com#后接
\S*?#允许视频ID以下的任何内容,
[^\w\s-]#但ID之前的字符是非ID字符。
)#终端主机替代方案。
([\w-]{11})#$1:VIDEO_ID正好是11个字符。
(?=[^\w-]|$)#断言下一个字符是非ID或EOS。
(?!#断言URL未预链接。
[?=&+%\w.-]*#允许URL(查询)余数。
(?:#将预先链接的备选方案分组。
[\'”][^]*>#在开始标记内,
|#或“内部”,
$text);
返回$text;
}
;//结束$YouTubeId
下面是一个JavaScript版本,具有完全相同的正则表达式(删除注释):
//链接尚未链接的youtube URL。
函数链接IfyYouTubeUrls(文本){
var re=/https?:\/\/(?:[0-9A-Z-]+\)(?:youtu\.be\/|youtube(?:-nocookie)?com\S*?[^\w\S-]([\w-]{11})(?=[^\w-]$)(?![?=&+%\w-]*(?:['''.[^][^]*>>)[?=+++-]*)[?=&+%\w.]*/ig;
返回文本。替换(重新,
'');
}
注意事项:
- URL的视频ID部分在唯一捕获组中捕获:
$1
- 如果您知道您的文本不包含任何预链接的URL,您可以安全地删除测试此条件的否定前瞻断言(以注释“Assert URL未预链接”开头的断言),这将在一定程度上加快正则表达式的速度
- 替换字符串可以根据需要进行修改。上面提供的字符串只创建到通用
的链接http://www.youtube.com/watch?v=VIDEO_ID“
设置URL样式并将链接文本设置为:“YouTube链接:视频\u ID”
编辑2011-07-05:在ID字符类中添加了-
连字符
编辑2011-07-17:修复了正则表达式以使用YouTube ID之后URL的任何剩余部分(例如查询)。添加了'i'
忽略大小写修饰符。将函数重命名为camelCase。改进了预链接的前瞻测试
编辑2011-07-27:添加了新的YouTube URL的“用户”和“屏幕房间”格式
编辑2011-08-02:简化/通用以处理新的“任意/事情/进展”YouTube URL
编辑2011-08-25:一些修改:
- 添加了Javascript版本的:
linkifyY
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;
}
[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*
/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;
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)
[?&]v=([^&#]*)
$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;
}
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);
}