【问题标题】:Adjust youtube url to embed parser to remove extras调整 youtube url 以嵌入解析器以删除额外内容
【发布时间】:2014-03-28 09:10:56
【问题描述】:

我有这个 php 代码可以自动将 youtube 网址转换为视频:

    $search = '%
    (?:https?://)?
    (?:www\.)?
    (?:
      youtu\.be/
    | youtube\.com
      (?:
        /embed/
      | /v/
      | /watch\?v=
      | /watch\?feature=player_embedded&v=
      )
    )
    ([\w\-]{10,12})
    \b
    %x';

    $replace = "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/$1\" data-youtube-id=\"$1\" frameborder=\"0\" allowfullscreen></iframe>";

return preg_replace($search, $replace, $url);

去除视频 ID 之后的任何内容的最简单方法是什么?

【问题讨论】:

  • 请提供您尝试实现的输出示例
  • 你正在使用的是最好的方法。这是考虑到您可以获得的几乎所有 youtube 网址的情况。
  • 在尝试获取 URL 的一部分时,我总是尝试使用 php 的 parse_url,在某些情况下它比正则表达式更强大。
  • @LiamDawe 我没有从你的问题中意识到,你总是可以使用一个正常的 url 正则表达式解析器,它通常工作得很好,然后运行 ​​parse_url 来获取参数。可能更容易

标签: php regex


【解决方案1】:

哇。建议的链接实际上链接到另一个正则表达式。使用parse_url 和parse_str,这就是它们的用途,请参阅this answer。使用正则表达式 is hard 解析 URL,没有理由重新发明轮子。

【讨论】:

  • 我没有直接放入链接,而是从更大的文本中获取它,所以我不能只是 parse_url 它。
  • @LiamDawe - 好吧,这更有意义,您能否在问题中提及这一点?我仍然建议使用“更轻”的正则表达式来查找 URL,然后使用 parse_url,但这确实是你的电话。例如,根据您找到 URL 的位置,您可能需要匹配的不仅仅是 \?v= 和 \?feature=...&amp;v=,并且您需要相应地更改您的正则表达式。 /v/?foo=bar&amp;v= 也是一个有效的 youtube URL。
  • 添加了我自己的答案:)
【解决方案2】:

感谢其他链接,我找到了一种方法,这是一个搜索正文并将所有 youtube 链接替换为视频的功能:

function youtube($body)
{   
    $video_pattern = '~(?: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;:@#?&%=+\/\$_.-]*~i';

    preg_match_all($video_pattern, $body, $matches);
    //print_r($matches[0]);

    foreach ($matches[0] as $url)
    {
        if (strpos($url, 'feature=youtu.be') == TRUE || strpos($url, 'youtu.be') == FALSE ) 
        {
            parse_str(parse_url($url, PHP_URL_QUERY), $id);
            $id = $id['v'];
        } 
        else 
        {
            $id = basename($url);
        }

        $body = str_replace($url, "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/{$id}\" data-youtube-id=\"{$id}\" frameborder=\"0\" allowfullscreen></iframe>", $body);
    }

    return $body;
}

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多