كيفية الحصول على امتداد الملف في PHP: من المبتدئ إلى المحترف في 2025
\n\nهل تساءلت يومًا كم مرة يحتاج مطور PHP لاستخراج امتداد الملف في اليوم؟ عشرات، إن لم يكن مئات المرات. رفع الصور الرمزية، معالجة المستندات، التحقق من صحة الصور — في كل مكان تحتاج لمعرفة نوع الملف الذي تتعامل معه: .jpg، .pdf أو المخادع .php.jpg.
سؤال "How can I get a file's extension in PHP?" هو من أكثر الأسئلة شيوعًا على Stack Overflow. وليس بدون سبب. قد يبدو الأمر بسيطًا، لكن الشيطان يكمن في التفاصيل. في 2025، لدينا ليس فقط الدوال الكلاسيكية pathinfo() و explode()، بل أيضًا إمكانيات جديدة في PHP 8.4 تجعل الكود أنظف وأكثر أمانًا.
دعنا نستعرض 5 طرق عملية مع مميزاتها وعيوبها ومتى تستخدم كل منها. هيا بنا!
\n\n1. الطريقة الكلاسيكية: pathinfo() — ملك جميع الطرق
\n\nالطريقة الأكثر شيوعًا وصحة هي دالة pathinfo(). ظهرت منذ PHP 4 وما زالت تحتفظ بأهميتها. لماذا؟ لأنها ذكية: تراعي فواصل المسارات في النظام، تعمل مع عناوين URL، ولا تنكسر عند وجود نقاط في اسم الملف.
<?php\n$file = 'document.report.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\n// النتيجة: 'pdf'\n?>\n\nلكن هناك ملاحظة: إذا لم يكن للملف امتداد، فإن pathinfo() ترجع سلسلة فارغة. ليست null ولا false — بل سلسلة فارغة. هذا مهم للتحقق الدقيق.
<?php\n$file = 'README';\n$ext = pathinfo($file, PATHINFO_EXTENSION);\nvar_dump($ext); // string(0) ""\n?>\n\nمتى تستخدم: دائمًا عندما تحتاج للحصول على الامتداد بسرعة وموثوقية. هذا هو المعيار الصناعي.
\n\n2. الطريقة التقليدية: explode() و strrpos()
\n\nبعض المطورين القدامى يفضلون التحليل اليدوي للنصوص. الفكرة بسيطة: ابحث عن آخر نقطة وخذ كل ما بعدها.
\n\n<?php\n$file = 'image.jpg';\n$parts = explode('.', $file);\n$extension = end($parts);\n// النتيجة: 'jpg'\n?>\n\nيبدو أنها تعمل. لكن هناك مشكلة: explode() تنشئ مصفوفة، و end() تغير المؤشر الداخلي للمصفوفة. ليس خطيرًا، لكنه غير أنيق.
البديل الأكثر كفاءة هو strrpos() + substr():
<?php\n$file = 'archive.tar.gz';\n$pos = strrpos($file, '.');\n$extension = $pos !== false ? substr($file, $pos + 1) : '';\n// النتيجة: 'gz'\n?>\n\nلاحظ: strrpos() تبحث عن آخر ظهور للنقطة. هذا صحيح — نريد gz وليس tar.gz.
متى تستخدم: عندما تكون pathinfo() غير متاحة (في حالات نادرة) أو تحتاج تحكمًا أكبر في المنطق.
3. الجديد في 2025: str_contains() و str_starts_with()
\n\nفي PHP 8.0 ظهرت str_contains() و str_starts_with()، وفي PHP 8.4 تحسنت معالجة السلاسل متعددة البايت. هذا يفتح طرقًا أنيقة جديدة.
<?php\n$file = 'photo.2025.jpg';\n\nif (str_contains($file, '.')) {\n $extension = substr($file, strrpos($file, '.') + 1);\n} else {\n $extension = '';\n}\n// النتيجة: 'jpg'\n?>\n\nجميلة؟ ليس تمامًا. لكن إذا كنت تريد التحقق مما إذا كان الملف صورة، فإن str_ends_with() هو صديقك:
<?php\n$file = 'avatar.png';\n$isImage = str_ends_with($file, '.png') || str_ends_with($file, '.jpg');\n// true\n?>\n\nمتى تستخدم: للتحقق السريع من امتدادات محددة دون استخراج الامتداد بالكامل.
\n\n4. التعبيرات المنتظمة: عندما تريد كل شيء دفعة واحدة
\n\nأحيانًا لا يكفي امتداد واحد. مثلًا، تحتاج للتحقق من أن الملف صورة آمنة واستخراج الاسم بدون امتداد في نفس الوقت. هنا يأتي دور التعبيرات المنتظمة.