Php 如何使用正则表达式在字符串中查找所有YouTube视频ID?

Php 如何使用正则表达式在字符串中查找所有YouTube视频ID?,php,regex,youtube,Php,Regex,Youtube,我有一个文本字段,用户可以在其中写入任何内容 例如: Lorem Ipsum只是一个虚拟文本。 印刷排版技术 工业。Lorem Ipsum一直是 行业标准的虚拟文本 从16世纪开始,当一个未知的 印刷工拿起了一个打字和打印的厨房 把它搅乱做成一个标本 书。它不仅存活了五年 百年,更是一跃而成 电子排版,剩余 基本上没有变化。 它在20世纪60年代开始流行 Letraset表的发布 包含Lorem Ipsum段,以及 最近的桌面出版 像Aldus PageMaker这样的软件 包括Lorem Ip

我有一个文本字段,用户可以在其中写入任何内容

例如:

Lorem Ipsum只是一个虚拟文本。 印刷排版技术 工业。Lorem Ipsum一直是 行业标准的虚拟文本 从16世纪开始,当一个未知的 印刷工拿起了一个打字和打印的厨房 把它搅乱做成一个标本 书。它不仅存活了五年 百年,更是一跃而成 电子排版,剩余 基本上没有变化。 它在20世纪60年代开始流行 Letraset表的发布 包含Lorem Ipsum段,以及 最近的桌面出版 像Aldus PageMaker这样的软件 包括Lorem Ipsum的版本

现在我想解析它并找到所有YouTube视频URL及其ID


知道这是怎么回事吗?

我曾经为一个提取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);
    
        }