كيف يمكنني الحصول على (استخراج) امتداد الملف في PHP؟
-
05-07-2019 - |
سؤال
هذا سؤال يمكنك قراءته في كل مكان على الويب مع إجابات مختلفة:
$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);
$exts = split("[/\\.]", $filename);
$n = count($exts)-1;
$ext = $exts[$n];
إلخ.
ومع ذلك، هناك دائمًا "أفضل طريقة" ويجب أن تكون موجودة في Stack Overflow.
المحلول
والناس من لغات البرمجة الأخرى يعتقدون دائما لهم هو أفضل لأن لديهم وظيفة المدمج في القيام بذلك وليس PHP (أنا أبحث في Pythonistas الآن: -)).
في الواقع، فإنه لا وجود لها، ولكن قلة من الناس يعرفون ذلك. لقاء pathinfo()
:
$ext = pathinfo($filename, PATHINFO_EXTENSION);
وهذا هو سريع ومدمج. pathinfo()
يمكن أن تعطيك معلومات أخرى، مثل مسار قانوني، وهذا يتوقف على ثابت الذي يمر به.
وتذكر أنه إذا كنت تريد أن تكون قادرة على التعامل مع شخصيات غير ASCII، تحتاج إلى تعيين الإعدادات المحلية أولا. منها مثلا:
setlocale(LC_ALL,'en_US.UTF-8');
لاحظ أيضا أن هذا لا يأخذ في الاعتبار محتوى الملف أو التمثيل الصامت من نوع، كنت فقط الحصول على التمديد. ولكن ما الذي طلب.
وأخيرا، لاحظ أن هذا يعمل فقط لمسار الملف، لا مسار الموارد URL، وهو مغطى باستخدام PARSE_URL.
واستمتع
نصائح أخرى
$path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; // "bill"
مثال لعنوان URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
بالنسبة لعناوين URL، لا تستخدمها PATHINFO
:
$x = pathinfo($url);
$x['dirname'] 🡺 'http://example.com/myfolder'
$x['basename'] 🡺 'sympony.mp3?a=1&b=2#XYZ' // <------- BAD !!
$x['extension'] 🡺 'mp3?a=1&b=2#XYZ' // <------- BAD !!
$x['filename'] 🡺 'sympony'
يستخدم PARSE_URL بدلاً من:
$x = parse_url($url);
$x['scheme'] 🡺 'http'
$x['host'] 🡺 'example.com'
$x['path'] 🡺 '/myfolder/sympony.mp3'
$x['query'] 🡺 'aa=1&bb=2'
$x['fragment']🡺 'XYZ'
ملحوظة:لا تتوفر علامات التصنيف في جانب الخادم، إلا إذا تمت إضافتها يدويًا.
للاطلاع على جميع أمثلة PHP الأصلية، راجع: احصل على عنوان URL الكامل في PHP
وهناك أيضا SplFileInfo
:
$file = new SplFileInfo($path);
$ext = $file->getExtension();
وغالبا ما يمكنك كتابة التعليمات البرمجية بشكل أفضل إذا قمت بتمرير مثل هذا الكائن حول بدلا من سلسلة، والتعليمات البرمجية يتحدث أكثر ثم. منذ PHP 5.4 هذا هو أونيلينير:
$ext = (new SplFileInfo($path))->getExtension();
واستجابة ساتيس E هي الطريقة الصحيحة لتحديد امتداد الملف.
وبدلا من ذلك، بدلا من الاعتماد على امتداد الملفات، يمكن استخدام fileinfo ( HTTP: //us2.php. صافي / fileinfo ) لتحديد الملفات نوع مايم.
وهنا مثال مبسط لمعالجة صورة تم تحميلها من قبل مستخدم:
// Code assumes necessary extensions are installed and a successful file upload has already occurred
// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');
// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {
case 'image/jpg':
$im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
break;
case 'image/png':
$im = imagecreatefrompng($_FILES['image']['tmp_name']);
break;
case 'image/gif':
$im = imagecreatefromgif($_FILES['image']['tmp_name']);
break;
}
1) إذا كنت تستخدم (بي إتش بي 5 >= 5.3.6)يمكنك استخدام SplFileInfo::getExtension - الحصول على امتداد الملف
رمز المثال
<?php
$info = new SplFileInfo('test.png');
var_dump($info->getExtension());
$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());
?>
هذا سوف يخرج
string(3) "png"
string(2) "gz"
2) طريقة أخرى للحصول على الامتداد إذا كنت تستخدمه (PHP 4 >= 4.0.3، PHP 5) يكون com.pathinfo
رمز المثال
<?php
$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);
$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);
?>
هذا سوف يخرج
string(3) "png"
string(2) "gz"
// يحرر:إزالة قوس
وطالما أنه لا يحتوي على مسار يمكنك أيضا استخدام:
array_pop(explode('.',$fname))
وأين $fname
هو اسم الملف، على سبيل المثال: my_picture.jpg
والنتيجة ستكون: jpg
وأحيانا يكون من المفيد عدم استخدام pathinfo($path, PATHINFO_EXTENSION)
، على سبيل المثال:
$path = '/path/to/file.tar.gz';
echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz
لاحظ أيضا أن فشل pathinfo
للتعامل مع بعض الأحرف غير ASCII (عادة ما يقمع فقط منهم من إخراج)، في الملحقات التي عادة ما تكون ليست مشكلة ولكن لا ضير في أن يكون على بينة من هذا التحذير.
وأبسط طريقة للحصول على ملف التمديد في بي هو استخدام فب المدمج في وظيفة pathinfo .
$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html
substr($path, strrpos($path, '.') + 1);
وهناك حل سريع سيكون شيئا من هذا القبيل.
//exploding the file based on . operator
$file_ext = explode('.',$filename);
//count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count=count($file_ext);
//minus 1 to make the offset correct
$cnt=$file_ext_count-1;
// the variable will have a value pdf as per the sample file name mentioned above.
$file_extension= $file_ext[$cnt];
وهنا هو سبيل المثال، لنفترض $ اسم الملف هو "example.txt"
$ext = substr($filename,strrpos($filename,'.',-1),strlen($filename));
وهكذا $ تحويلة سيكون ". TXT"
com.pathinfo هو مصفوفة.يمكننا التحقق اسم الدليل، اسم الملف، الامتداد إلخ
$path_parts = pathinfo('test.png');
echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";
ويمكنك أيضا محاولة هذا
(العمل على PHP 5. * و7)
$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip
نصيحة: أن تعود سلسلة فارغة إذا كان الملف بدون ملحق
يتمتع بها.)
وهذا سيعمل
$ext = pathinfo($filename, PATHINFO_EXTENSION);
ولقد وجدت أن pathinfo()
والحلول SplFileInfo
يعمل بشكل جيد لملفات القياسية على نظام الملفات المحلي، ولكن هل يمكن أن تصل إلى صعوبات إذا كنت تعمل مع الملفات عن بعد ب URLs للصور صالحة قد يكون له #
(معرفات جزء) و / أو ?
(معلمات الاستعلام) في نهاية URL، وكلاهما تلك الحلول سوف (غير صحيح) يعامل كجزء من ملف التمديد.
ولقد وجدت أن هذه طريقة يمكن الاعتماد عليها لاستخدام pathinfo()
على URL بعد تحليل لأول مرة لتجريد من فوضى لا لزوم له بعد التمديد الملف:
$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
ويمكنك أيضا محاولة هذا:
pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)
لماذا لا لاستخدام substr($path, strrpos($path,'.')+1);
؟
هو أسرع طريقة لكل مقارنة.
أجابKurt تشونغ بالفعل.
ودعونا تحقق نتيجة المقارنة هنا: https://eval.in/661574
ويمكنك الحصول على كل ملحق الملف على مجلد معين والقيام بالتعاون مع امتداد ملف معين
<?php
$files=glob("abc/*.*");//abc is folder all files inside folder
//print_r($files);
//echo count($files);
for($i=0;$i<count($files);$i++):
$extension = pathinfo($files[$i], PATHINFO_EXTENSION);
$ext[]=$extension;
//do operation for perticular extenstion type
if($extension=='html'){
//do operation
}
endfor;
print_r($ext);
?>
إذا كنت تبحث عن السرعة (كما هو الحال في جهاز التوجيه)، وربما كنت لا تريد أن tokenize كل شيء. سوف تفشل العديد من الإجابات الأخرى مع /root/my.folder/my.css
ltrim(strrchr($PATH, '.'),'.');
على الرغم من أن "أفضل طريقة" قابلة للنقاش، إلا أنني أعتقد أن هذه هي أفضل طريقة لعدة أسباب:
function getExt($path)
{
$basename = basename($path);
return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
- وهو يعمل مع أجزاء متعددة لامتداد، على سبيل المثال
tar.gz
- رمز قصير وفعال
- إنه يعمل مع كل من اسم الملف والمسار الكامل
في الواقع، كنت أبحث عن ذلك.
<?php
$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);
var_dump($ext);
وIMO هذه هي أفضل طريقة إذا كان لديك أسماء مثل name.name.name.ext (قبيحة ولكن يحدث في بعض الأحيان)
$ext = explode( '.', $filename ); //explode the string
$ext_len = count( $ext ) - 1; //count the array -1 (becouse count() starts from 1)
$my_ext = $ext[ $ext_len ]; //get the last entry of the array
echo $my_ext;
استخدم
str_replace('.', '', strrchr($file_name, '.'))
ولاسترجاع تمديد سريعة (إذا كنت تعرف على وجه اليقين اسم الملف الخاص بك لديها واحد).