Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ดึง YouTube Video ID จาก URL ด้วย PHP (parse_url + parse_str)

วิธีที่น่าเชื่อถือที่สุดคือใช้ parse_url() และ parse_str() แทน Regex เพราะ URL ของ YouTube มีรูปแบบหลายแบบ

รูปแบบ YouTube URL ที่พบบ่อย

  • https://www.youtube.com/watch?v=VIDEO_ID
  • https://youtu.be/VIDEO_ID
  • https://www.youtube.com/embed/VIDEO_ID
  • https://www.youtube.com/v/VIDEO_ID
  • https://www.youtube.com/shorts/VIDEO_ID
  • https://m.youtube.com/watch?v=VIDEO_ID

ฟังก์ชันครบวงจร (รองรับทุกรูปแบบ)

/**
 * ดึง YouTube Video ID จาก URL
 * 
 * @param string $url
 * @return string|false Video ID (11 ตัวอักษร) หรือ false ถ้าไม่พบ
 */
function getYouTubeVideoId($url) {
    $url = trim($url);
    
    // 1. Short URL: youtu.be/VIDEO_ID
    if (strpos($url, 'youtu.be') !== false) {
        $path = parse_url($url, PHP_URL_PATH);
        $videoId = trim($path, '/');
        if (preg_match('/^[a-zA-Z0-9_-]{11}$/', $videoId)) {
            return $videoId;
        }
    }
    
    // 2. Standard URL: youtube.com/watch?v=VIDEO_ID
    $parsed = parse_url($url);
    if (isset($parsed['query'])) {
        parse_str($parsed['query'], $queryParams);
        if (isset($queryParams['v']) && preg_match('/^[a-zA-Z0-9_-]{11}$/', $queryParams['v'])) {
            return $queryParams['v'];
        }
    }
    
    // 3. Embed/Shorts/Short URL: /embed/ID, /shorts/ID, /v/ID
    $path = $parsed['path'] ?? '';
    $patterns = [
        '#/embed/([a-zA-Z0-9_-]{11})#',
        '#/shorts/([a-zA-Z0-9_-]{11})#',
        '#/v/([a-zA-Z0-9_-]{11})#',
    ];
    
    foreach ($patterns as $pattern) {
        if (preg_match($pattern, $path, $matches)) {
            return $matches[1];
        }
    }
    
    return false;
}

// ทดสอบ
$urls = [
    'https://www.youtube.com/watch?v=VX96I7PO8YU',
    'https://youtu.be/VX96I7PO8YU',
    'https://www.youtube.com/embed/VX96I7PO8YU',
    'https://www.youtube.com/shorts/VX96I7PO8YU',
    'https://www.youtube.com/v/VX96I7PO8YU',
    'https://m.youtube.com/watch?v=VX96I7PO8YU&feature=share',
    'invalid-url',
];

foreach ($urls as $url) {
    echo $url . ' => ' . (getYouTubeVideoId($url) ?? 'NOT FOUND') . "\n";
}

ทำไมไม่แนะนำ Regex อย่างเดียว?

// Regex แบบง่าย - มี Bug เยอะ
preg_match('/v=([^&]+)/', $url, $m); // ไม่รองรับ youtu.be, embed, shorts
preg_match('/youtu\.be\/([^?&]+)/', $url, $m); // ไม่รองรับ watch?v=

// Regex แบบซับซ้อน - ยากต่อการ Maintain
// parse_url + parse_str เป็นมาตรฐาน RFC 3986 จัดการ URL ได้ถูกต้อง

ดึงข้อมูลเพิ่มเติม (YouTube Data API v3)

// ต้องมี API Key จาก Google Cloud Console
function getYouTubeVideoInfo($videoId, $apiKey) {
    $url = "https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id={$videoId}&key={$apiKey}";
    
    $response = file_get_contents($url);
    $data = json_decode($response, true);
    
    if (isset($data['items'][0])) {
        return $data['items'][0];
    }
    return null;
}

// ใช้งาน
$videoId = getYouTubeVideoId($url);
if ($videoId) {
    $info = getYouTubeVideoInfo($videoId, 'YOUR_API_KEY');
    echo "Title: " . $info['snippet']['title'] . "\n";
    echo "Duration: " . $info['contentDetails']['duration'] . "\n"; // ISO 8601 (PT1H2M3S)
    echo "Views: " . $info['statistics']['viewCount'] . "\n";
}

สร้าง Embed URL

function getYouTubeEmbedUrl($videoId, $options = []) {
    $defaults = [
        'autoplay' => 0,
        'controls' => 1,
        'rel' => 0,
        'modestbranding' => 1,
    ];
    $params = http_build_query(array_merge($defaults, $options));
    return "https://www.youtube.com/embed/{$videoId}?{$params}";
}

echo getYouTubeEmbedUrl('VX96I7PO8YU', ['autoplay' => 1, 'start' => 30]);
// https://www.youtube.com/embed/VX96I7PO8YU?autoplay=1&controls=1&rel=0&modestbranding=1&start=30