【问题标题】:Parse url to get rid of all parameters after the first解析 url 以摆脱第一个之后的所有参数
【发布时间】:2012-05-01 19:46:12
【问题描述】:

据我了解,youtube.com 的视频链接使用三种类型的网址。

http://www.youtube.com/watch?v=8uLPtmCroQ8&feature=related
http://www.youtube.com/watch?v=8uLPtmCroQ8
http://youtu.be/8uLPtmCroQ8

我通过这些不同方式中的任何一种将这个 url 提交到我的网站,并将该 url 存储到一个名为 $video_code 的自定义字段中。我需要删除视频 id 之后的任何参数,因此如果用户提交上面的第一个 url,&feature=related 会被删除。我正在使用 php。

【问题讨论】:

  • v 参数并不总是第一个。你不应该依赖那个。另外,昨天有人问过这个问题:stackoverflow.com/a/10387324/362536
  • 好的,我需要做的是从任何类型的 youtube 视频 url 中提取 ID。您发布的问题不适用于 youtu.be 网址吗?我打算使用这个stackoverflow.com/questions/6556559/…,但如果url在id后面有参数,它就不起作用了。

标签: php parsing youtube


【解决方案1】:

如果我正确理解您的问题,您可以使用类似的方法将视频 id 存储在数据库中,然后根据需要构建 url。

function getVideoId($url)
{
    $parsedUrl = parse_url($url);
    if ($parsedUrl === false)
        return false;

    if (!empty($parsedUrl['query']))
    {
        $query = array();
        parse_str($parsedUrl['query'], $query);
        if (!empty($query['v']))
            return $query['v'];
    }

    if (in_array(strtolower($parsedUrl['host']), array('youtu.be', 'www.youtu.be')))
        return trim($parsedUrl['path'], '/');

    return false;
}

$input = array('http://www.youtube.com/watch?v=8uLPtmCroQ8&feature=related', 'http://www.youtube.com/watch?v=8uLPtmCroQ8', 'http://youtu.be/8uLPtmCroQ8');

foreach ($input as $url)
{
    echo getVideoId($url) . PHP_EOL;
}

【讨论】:

  • 我让它有点误导,听起来好像我将所有三个 url 都存储到了自定义字段中,而实际上我的意思是 url 可能是其中之一。但这非常适合我需要的方式。谢谢。
【解决方案2】:

您希望使用哪种语言?如果是在 PHP 中,您应该查看 this

【讨论】:

  • 我看到了,但这对我来说没有意义。你能握住我的手并举例说明如何做吗?
【解决方案3】:

您还可以使用正则表达式来拆分字符串。看这里:http://www.php.net/manual/en/function.preg-split.php

【讨论】:

    【解决方案4】:

    使用此代码:

    $arr=array(
    'http://www.youtube.com/watch?v=8uLPtmCroQ8&feature=related',
    'http://www.youtube.com/watch?v=8uLPtmCroQ8',
    'http://youtu.be/8uLPtmCroQ8',
    );
    for($i=0; $i<count($arr); $i++){
       $urlarr = parse_url($arr[$i]);
       if (!empty($urlarr['query'])) {
          parse_str($urlarr['query']);
          $qarr = array();
          if (!empty($v))
             $qarr['v'] = $v;
          $urlarr['query'] = http_build_query($qarr);
          $arr[$i] = http_build_url('', $urlarr);
       }
    }
    print_r($arr);
    

    输出:

    Array
    (
        [0] => http://www.youtube.com/watch?v=8uLPtmCroQ8
        [1] => http://www.youtube.com/watch?v=8uLPtmCroQ8
        [2] => http://youtu.be/8uLPtmCroQ8
    )
    

    【讨论】:

      【解决方案5】:
      function getVideoCode($url){
      $videoCode;
      $code_parse = parse_url($url);
      if(empty($code_parse["query"])){
          $videoCode = str_replace("/"," ",$code_parse["path"]);
      }else{
          $videoCode = clearQuery($code_parse["query"]);
      }
      echo $videoCode;
      }
      function clearQuery($query){
      $redundant = array("v", "&", "feature","=","related"); 
      return str_replace($redundant," ",$query);
      }
      

      这不是专业的代码,但很容易理解。当我这样调用时:

      getVideoCode("http://youtu.be/8uLPtmCroQ8");
      getVideoCode("http://www.youtube.com/watch?v=8uLPtmCroQ8");
      getVideoCode("http://www.youtube.com/watch?v=8uLPtmCroQ8&feature=related");
      

      输出是

      • 8uLPtmCroQ8
      • 8uLPtmCroQ8
      • 8uLPtmCroQ8

      【讨论】:

        猜你喜欢
        • 2017-02-05
        • 2011-09-13
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 2020-11-08
        • 2020-02-05
        • 2021-03-29
        • 2021-02-14
        相关资源
        最近更新 更多