專案需求:使用者提交優酷、土豆視頻的分享頁面或 SWF 直連,後端自動識別並提取標準 SWF 播放器地址供前端嵌入。本文提供一個私有方法 _getSwf() 實現此邏輯。
<?php
/**
* 根據用戶提交的 URL 獲取優酷、土豆標準 SWF 播放地址
* @param string $url 用戶輸入的視頻鏈接
* @return string|false SWF 地址或 false
*/
private function _getSwf($url = '') {
if (empty($url)) return false;
// 解析域名與路徑
preg_match_all('/http:\/\/(.*?)?\.(.*?)?\.com\/(.*)/', $url, $types);
if (empty($types[1][0])) return false;
$domain = $types[1][0]; // 子域名
$type = $types[2][0]; // 主域名
$path = $types[3][0]; // 路徑
$isswf = (strpos($path, 'v.swf') !== false);
$method = substr($path, 0, 1); // 首字母判斷類型
switch ($type) {
case 'youku':
if ($domain === 'player') {
// 已是播放器直連
$swf = $url;
} elseif ($domain === 'v') {
// 視頻頁面:https://v.youku.com/v_show/id_XXXX.html
preg_match_all('/http:\/\/v\.youku\.com\/v_show\/id_(.*?)\.html/', $url, $url_array);
$vid = str_replace('/', '', $url_array[1][0]);
$swf = 'https://player.youku.com/player.php/sid/' . $vid . '/v.swf';
} else {
$swf = $url; // 其他情況原樣返回
}
break;
case 'tudou':
if ($isswf) {
$swf = $url; // 已是 SWF
} else {
// 頁面鏈接:https://www.tudou.com/(p|v|...)/ID/
$method = ($method === 'p') ? 'v' : $method; // 統一轉 v
preg_match_all('/http:\/\/www\.tudou\.com\/(.*?)\/(.*?)/', $url, $url_array);
$segments = explode('/', $url_array[1][0]);
$count = count($segments);
if ($count === 1) {
$id = explode('.', $url_array[2][0])[0];
} elseif ($count === 2) {
$id = $segments[1];
} elseif ($count === 3) {
$id = $segments[2];
} else {
return false;
}
$swf = 'https://www.tudou.com/' . $method . '/' . $id . '/v.swf';
}
break;
default:
$swf = $url; // 不支援站點原樣返回
break;
}
return $swf;
}
?>
| 平台 | 輸入格式 | 輸出 SWF 格式 |
|---|---|---|
| 優酷 | https://v.youku.com/v_show/id_XMTIzNDU2.html | https://player.youku.com/player.php/sid/XMTIzNDU2/v.swf |
| 優酷 | https://player.youku.com/player.php/sid/XXX/v.swf | 原樣返回 |
| 土豆 | https://www.tudou.com/v/abcdefg/ | https://www.tudou.com/v/abcdefg/v.swf |
| 土豆 | https://www.tudou.com/p/abcdefg.html | https://www.tudou.com/v/abcdefg/v.swf |
| 土豆 | https://www.tudou.com/xxx/yyy/abcdefg/ | https://www.tudou.com/v/abcdefg/v.swf |
注意:視頻網站播放器地址規則常變,建議建立配置檔管理正則規則,便於熱更新,避免硬編碼頻繁改動代碼。