كيف يمكنني الحصول على (استخراج) امتداد الملف في PHP؟

StackOverflow https://stackoverflow.com/questions/173868

  •  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.

واستمتع

نصائح أخرى

pathinfo()

$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);
}
  1. وهو يعمل مع أجزاء متعددة لامتداد، على سبيل المثال tar.gz
  2. رمز قصير وفعال
  3. إنه يعمل مع كل من اسم الملف والمسار الكامل

في الواقع، كنت أبحث عن ذلك.

<?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, '.'))

ولاسترجاع تمديد سريعة (إذا كنت تعرف على وجه اليقين اسم الملف الخاص بك لديها واحد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top