【问题标题】:Get Youtube Video ID from html code with PHP使用 PHP 从 html 代码中获取 Youtube 视频 ID
【发布时间】:2009-11-20 23:19:50
【问题描述】:

我想从 html 代码中获取所有唯一的 youtube 视频 ID

查看 youtube 视频的(或多个)对象/嵌入代码

// 来自数据库的html

    <p>loremm ipsum dolor sit amet enot
    <a href="link" attribute=""blah blah blah">anchor link</a>
    </p>

    <object width="425" height="344">
        <param name="movie" value="http://www.youtube.com/v/Ou5eVl5eqtg&hl=es_ES&fs=1&"></param>
        <param name="allowFullScreen" value="true"></param>
        <param name="allowscriptaccess" value="always"></param>
        <embed src="http://www.youtube.com/v/Ou5eVl5eqtg&hl=es_ES&fs=1&"
    type="application/x-shockwave-flash"
    allowscriptaccess="always"
    allowfullscreen="true"
    width="425"
    height="344">
    </embed>
        </object>

    <image src="path/to/image.ext" >
    <p>lorem ipsum dolor sit amet... blah</p>
    <p>lorem ipsum dolor sit amet... blah</p>

    <object width="425" height="344">
        <param name="movie" value="http://www.youtube.com/v/Ou5eVl5eqtg&hl=es_ES&fs=1&"></param>
        <param name="allowFullScreen" value="true"></param>
        <param name="allowscriptaccess" value="always"></param>
        <embed src="http://www.youtube.com/v/Ou5eVl5eqtg&hl=es_ES&fs=1&"
    type="application/x-shockwave-flash"
    allowscriptaccess="always"
    allowfullscreen="true"
    width="425"
    height="344">
    </embed>
        </object>
<p>blah</p>
blah<br/>
blah<br/>
blah<br/>

【问题讨论】:

  • ...你的问题是?您是否编写了任何非工作代码?
  • 我在互联网上创建了这段代码 preg_match('/[\\?\\&]v=([^\\?\\&]+)/',[youtubevidurl], $matches) ;但在这种情况下不起作用,我不精通正则表达式对不起我的英语:(

标签: php regex


【解决方案1】:

YouTube 视频网址一般有两种格式:

http://www.youtube.com/v/[videoid]
http://www.youtube.com/watch?v=[videoid]

“www.youtube.com”可以替换为“www.youtube.co.uk”或其他国家/地区代码,但据我所知,视频 ID 是相同的,无论域名。

视频 ID 是一个 11 个字符的字符串,使用 base-64 编码。

假设您有从 HTML 文档解析 url 的代码,您可以确定它是否是 YouTube 视频 url 并使用此正则表达式获取视频 id(用 C# 编写,但应该很容易转换为 php 或其他任何东西) :

"^http://(?<domain>([^./]+\\.)*youtube\\.com)(/v/|/watch\\?v=)(?<videoId>[A-Za-z0-9_-]{11})"

这个特殊的正则表达式是 youtube.com 特有的。让它理解所有不同的国家代码(youtube.co.uk、youtube.pl、youtube.it 等)需要更多的参与。

【讨论】:

  • 我想你可以弄清楚如何翻译它。
  • 你忘记了这个格式:youtu.be/[videoid] 例如:youtu.be/R_FOfQSarWY
  • @Anthony:在我写回复的时候,这种格式并不存在。感谢您的更新。
  • 完美。这个正则表达式匹配它应该匹配的所有内容,仅此而已。
  • 一个小错误修复 - 它不考虑查询字符串:"http://.+?(/v/|/watch\\?v=)(?P&lt;videoId&gt;[A-Za-z0-9_-]{11}).+?"
【解决方案2】:

实际上,要完全捕获所有选项,我发现WebFlakeStudio的解决方案是最好的,加上以下内容,可以捕获所有3种形式的*咳嗽*客户端愚蠢*咳嗽*

(PHP)

preg_match('#(\.be/|/embed/|/v/|/watch\?v=)([A-Za-z0-9_-]{5,11})#', $YoutubeCode, $matches);
if(isset($matches[2]) && $matches[2] != ''){
     $YoutubeCode = $matches[2];
}

我添加了 /embed,这应该会捕获所有内容。对象、URL 和嵌入选项。

【讨论】:

    【解决方案3】:

    从 htmlpurifier 的 youtube 插件中厚颜无耻地窃取:

    preg_match('#<object[^>]+>.+?http://www.youtube.com/v/([A-Za-z0-9\-_]+).+?</object>#s', $markup, $matches);
    var_dump($matches[1]);
    

    【讨论】:

      【解决方案4】:

      如果你想获得 youtube 视频的嵌入链接,你可以使用下面的代码 sn-p:

      $youtubeRegexp = "#(/v/|/watch\?v=)([A-Za-z0-9_-]{5,11})#";
      $embedUrl = preg_replace($youtubeRegexp, '/embed/$2', $videoUrl);
      

      目前嵌入代码为:

      <iframe width="{width}" height="{height}" src="{embed_url}" frameborder="0" allowfullscreen></iframe>
      

      注意:在运行此表达式之前,应将 $videoUrl 设置为原始 url。

      【讨论】:

        【解决方案5】:

        我可能会因为使用正则表达式来解析 html 而受到责骂,但考虑到这种情况,这可能是最好的方法吗?

        preg_match('~/v/([0-9a-z_]+)~i', $code, $matches);
        echo $matches[1];
        

        假设 youtube 视频 ID 的有效字符是 0-9a-z_

        【讨论】:

        • 它有效! ,但是有一种方法可以安全地执行此操作,仅强制用于 youtube vids?
        • 在 /v/ 之前添加 youtube.com
        猜你喜欢
        • 2020-11-05
        • 2011-11-05
        • 1970-01-01
        • 2021-02-10
        • 2012-04-15
        • 2011-03-24
        • 2016-09-28
        • 1970-01-01
        • 2014-06-28
        相关资源
        最近更新 更多