วิธีที่น่าเชื่อถือที่สุดคือใช้ parse_url() และ parse_str() แทน Regex เพราะ URL ของ YouTube มีรูปแบบหลายแบบ
รูปแบบ YouTube URL ที่พบบ่อย
https://www.youtube.com/watch?v=VIDEO_IDhttps://youtu.be/VIDEO_IDhttps://www.youtube.com/embed/VIDEO_IDhttps://www.youtube.com/v/VIDEO_IDhttps://www.youtube.com/shorts/VIDEO_IDhttps://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