自动解析Youtube链接

时间:2011-06-07 14:20:40

标签: php youtube

$message = preg_replace("#(http://(www.)?youtube.com)?/(v/|watch\?v\=)([-|~_0-9A-Za-z]+)&?.*?#i", "<iframe title=\"YouTube\" width=\"480\" height=\"390\" src=\"http://www.youtube.com/embed/$4\" frameborder=\"0\" allowfullscreen></iframe>", $message);

如果youtube链接如下所示,这样可以正常工作:

  

http://www.youtube.com/watch?v=9DhSwsbKJQ4

但如果Youtube链接如下所示会出现问题:

  

http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music

结果是iframe之后的iframe和文字feature=topvideos_music。有什么方法可以删除Youtube链接中&之后的所有内容吗?

8 个答案:

答案 0 :(得分:3)

为什么不使用parse_url()parse_str()功能?这是一个更安全的解决方案。

$url = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
// $url = 'http://www.youtube.com/v/9DhSwsbKJQ4?feature=topvideos_music';

$parsedUrl = parse_url($url);
parse_str($parsedUrl['query'], $parsedQueryString);

// URL in ?v=... form
if (isset($parsedQueryString['v'])) {
    $id = $parsedQueryString['v'];
}
// URL in /v/... form
else if (substr($parsedUrl['path'], 0, 3) == '/v/') {
    $id = substr($parsedUrl['path'], 3);
}
// invalid form
else {
    throw new ...;
}

答案 1 :(得分:2)

最好用parse_url()/ parse_str()分解URL,然后从头开始重建。

$url = 'http://www.youtube.com/....';

$url_parts = parse_url($url);

$query_parts = parse_str($parts['query']);

$v = $query_parts['v'];

$new_url = $url_parts['scheme']; // http
$new_url .= '://';
$new_url .= $url_parts['host']; // www.youtube.com
$new_url .= '/';
$new_url .= $url_parts['path']; // /
$new_url .= '?'
$new_url .= 'v' . $v; // v=....

虽然使用正则表达式进行解析会有效,但在某些时候它会转过来并咬你。这有点繁琐,但从长远来看更安全。

答案 2 :(得分:1)

正则表达式

我绝不是正则表达式,但以下内容删除了&符号及其后的所有内容:

$vidpath = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
echo preg_replace('/&.+/', '', $vidpath);

制作http://www.youtube.com/watch?v=9DhSwsbKJQ4

将它吹成碎片!

另一个选项是使用explode()并根据&的出现分割字符串,从而产生一个数组,其中0索引包含您想要的输出。

echo array_shift( explode( '&', $vidpath ) );

在这种情况下,array_shift()将返回索引为0的任何项目,这将是您的路径。

答案 3 :(得分:1)

短版。

$url = 'url_text';
$vidparser = parse_url($url);
parse_str($vidparser[query], $query);
$video_id = ($query['v']); 

答案 4 :(得分:0)

是。尝试在您的代码之前使用此代码:

$message = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
$message = explode( '&' , $message);
$message = $message[0];

现在,$message变量设置为http://www.youtube.com/watch?v=9DhSwsbKJQ4

答案 5 :(得分:0)

如果您想要的是我建议切换到这样的正则表达式的视频:

/(http\:\/\/(www\.)?youtube\.com)\/watch\?v=([^&]+)/ism

regextester.com

上进行了测试

答案 6 :(得分:0)

尝试pathinfo()

评论后编辑:尝试执行此操作:

<?php
$url='http://www.site.com/foo/bar.php?dummy=param&dummy2=param2';
$array=pathinfo($url);
?><pre><?php print_r($array); ?></pre>
<?php
$params=strrchr($array['extension'],'?');
$params=str_replace('?','',$params);
$params_array=explode('&',$params);
foreach ($params_array as $each) {
$eacharray=explode('=',$each);
echo $eacharray[0]; //key
echo '<br />';
echo $eacharray[1]; //value
echo '<br />';
}
?>

输出将是:

Array
(
    [dirname] => http://www.site.com/foo
    [basename] => bar.php?dummy=param&dummy2=param2
    [extension] => php?dummy=param&dummy2=param2
)
dummy
param
dummy2
param2

不是一个完美的例子,但你可以通过这种方法获得所有键/值。

edit2:对不起,我很着急,正在重新编辑我的邮件,以确切了解您的需求。

<?php
//code partially taken from php.net
$character='&';
$string='http://www.youtube.com/watch?v=asd123&feature=related&dummytext=true';
$whole_length = strlen($string); 
$right_length = (strlen(strstr($string, $character)) - 1); 
$left_length = ($whole_length - $right_length - 1); 

$piece = substr($string, 0, ($left_length));

echo $piece; //http://www.youtube.com/watch?v=asd123

?>

答案 7 :(得分:0)

如前所述,您可以首先将所有内容都输送到&amp;,或者您可以简单地执行以下操作(只需输入正则表达式即可)。

#(http://(www.)?youtube.com)?/(v/|watch\?v\=)([-|~_0-9A-Za-z]+)#i

为了使其更通用,您可以执行以下操作:

#(:?(:?(:?www\.)?youtube\.(:?[^/]{2,5})/(:?v/|watch\?v\=))|(:?youtu.be/))([-|~_0-9A-Za-z]+)#

正则表达式不需要匹配所有内容。所有:?都是为了避免preg_replace保留引用,并且通过这样做,它应该匹配缩短的URL。在这种情况下,引用将存储在$1