كيفية الحصول على امتداد الملف في PHP: أفضل الممارسات 2025

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية الحصول على امتداد الملف في PHP: من المبتدئ إلى المحترف في 2025

\n\n

هل تساءلت يومًا كم مرة يحتاج مطور PHP لاستخراج امتداد الملف في اليوم؟ عشرات، إن لم يكن مئات المرات. رفع الصور الرمزية، معالجة المستندات، التحقق من صحة الصور — في كل مكان تحتاج لمعرفة نوع الملف الذي تتعامل معه: .jpg، .pdf أو المخادع .php.jpg.

\n\n

سؤال "How can I get a file's extension in PHP?" هو من أكثر الأسئلة شيوعًا على Stack Overflow. وليس بدون سبب. قد يبدو الأمر بسيطًا، لكن الشيطان يكمن في التفاصيل. في 2025، لدينا ليس فقط الدوال الكلاسيكية pathinfo() و explode()، بل أيضًا إمكانيات جديدة في PHP 8.4 تجعل الكود أنظف وأكثر أمانًا.

\n\n

دعنا نستعرض 5 طرق عملية مع مميزاتها وعيوبها ومتى تستخدم كل منها. هيا بنا!

\n\n

1. الطريقة الكلاسيكية: pathinfo() — ملك جميع الطرق

\n\n

الطريقة الأكثر شيوعًا وصحة هي دالة pathinfo(). ظهرت منذ PHP 4 وما زالت تحتفظ بأهميتها. لماذا؟ لأنها ذكية: تراعي فواصل المسارات في النظام، تعمل مع عناوين URL، ولا تنكسر عند وجود نقاط في اسم الملف.

\n\n
<?php\n$file = 'document.report.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\n// النتيجة: 'pdf'\n?>
\n\n

لكن هناك ملاحظة: إذا لم يكن للملف امتداد، فإن pathinfo() ترجع سلسلة فارغة. ليست null ولا false — بل سلسلة فارغة. هذا مهم للتحقق الدقيق.

\n\n
<?php\n$file = 'README';\n$ext = pathinfo($file, PATHINFO_EXTENSION);\nvar_dump($ext); // string(0) ""\n?>
\n\n

متى تستخدم: دائمًا عندما تحتاج للحصول على الامتداد بسرعة وموثوقية. هذا هو المعيار الصناعي.

\n\n

2. الطريقة التقليدية: 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() تغير المؤشر الداخلي للمصفوفة. ليس خطيرًا، لكنه غير أنيق.

\n\n

البديل الأكثر كفاءة هو strrpos() + substr():

\n\n
<?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.

\n\n

متى تستخدم: عندما تكون pathinfo() غير متاحة (في حالات نادرة) أو تحتاج تحكمًا أكبر في المنطق.

\n\n

3. الجديد في 2025: str_contains() و str_starts_with()

\n\n

في PHP 8.0 ظهرت str_contains() و str_starts_with()، وفي PHP 8.4 تحسنت معالجة السلاسل متعددة البايت. هذا يفتح طرقًا أنيقة جديدة.

\n\n
<?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() هو صديقك:

\n\n
<?php\n$file = 'avatar.png';\n$isImage = str_ends_with($file, '.png') || str_ends_with($file, '.jpg');\n// true\n?>
\n\n

متى تستخدم: للتحقق السريع من امتدادات محددة دون استخراج الامتداد بالكامل.

\n\n

4. التعبيرات المنتظمة: عندما تريد كل شيء دفعة واحدة

\n\n

أحيانًا لا يكفي امتداد واحد. مثلًا، تحتاج للتحقق من أن الملف صورة آمنة واستخراج الاسم بدون امتداد في نفس الوقت. هنا يأتي دور التعبيرات المنتظمة.

المدونات

توصيات الكتب