मुझे PHP में फ़ाइल एक्सटेंशन कैसे मिलेगा?


723

यह एक ऐसा सवाल है जिसे आप वेब पर हर जगह विभिन्न उत्तरों के साथ पढ़ सकते हैं:

$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];

आदि।

हालांकि, हमेशा "सबसे अच्छा तरीका" होता है और यह स्टैक ओवरफ्लो पर होना चाहिए।


15
प्रश्न और उत्तर का स्रोत: cowburn.info/2008/01/13/get-file-extension-comparison
salathe

5
strrchr($filename, '.');
एक्सट्रा

जवाबों:


1776

अन्य स्क्रिप्टिंग भाषाओं के लोग हमेशा सोचते हैं कि उनका बेहतर है क्योंकि उनके पास ऐसा करने के लिए एक अंतर्निहित कार्य है और PHP नहीं है (मैं अभी Pythonistas देख रहा हूं :-))।

वास्तव में, यह मौजूद है, लेकिन बहुत कम लोग इसे जानते हैं। मिलें pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

यह तेज और बिल्ट-इन है। pathinfo()आपके द्वारा पास की गई स्थिरांक के आधार पर, आपको अन्य जानकारी दे सकता है, जैसे कि कैनोनिकल पथ।

याद रखें कि यदि आप गैर ASCII वर्णों से निपटने में सक्षम होना चाहते हैं, तो आपको पहले स्थान निर्धारित करने की आवश्यकता है। ईजी:

setlocale(LC_ALL,'en_US.UTF-8');

इसके अलावा, ध्यान दें कि यह फ़ाइल सामग्री या माइम-प्रकार को ध्यान में नहीं रखता है, आपको केवल एक्सटेंशन मिलता है। लेकिन यह वही है जो आपने मांगा था।

अंत में, ध्यान दें कि यह केवल एक फ़ाइल पथ के लिए काम करता है, न कि URL संसाधन पथ, जो PARSE_URL का उपयोग करके कवर किया गया है।

का आनंद लें


62
काश मैं इसे दो बार वोट कर पाता। मैं आपको यह नहीं बता सकता कि कितना कोड मैंने पैथिनफो का उपयोग करने में सक्षम किया है
मार्क बीएसी

8
तो मैं क्या मैं यहाँ डाल दिया!
ई-शनि

7
वाढय़ा को पता है, पता चलता है कि सबसे अच्छा तरीका है।
बेन

19
@khizaransari आपको किसी अन्य होस्टिंग प्रदाता की तलाश करनी चाहिए, जो आपको मिला है वह बेवकूफ है। वास्तव में, मेरा मतलब है। इस फ़ंक्शन को अक्षम करने का कोई कारण नहीं है। उन्हें यह बताओ। वर्कअराउंड के रूप में: function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }सुनिश्चित करें कि फ़ाइल में एक एक्सटेंशन है, हालांकि, यह कुछ भी कर सकता है जब आप एक मार्ग को तर्क के रूप में पास करते हैं!
ल्यूक

12
अजगर की तुलना में PHP का मेरा विचार अब पूरी तरह से बदल गया है कि मैं इस फ़ंक्शन के बारे में जानता हूं: O
टॉमासो बारबुगली

166

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"

14
चूंकि PHP 5.5 ->echo pathinfo('/foo/bar/baz.bill')['extension'];
सलमान ए

1
यह इस स्तर पर भी काम करता है (Twitter json): $ ext = pathinfo ($ result-> Extended_entities-> media [0] -> video_info-> वेरिएंट [1] -> url, PATHINFIN_EXTENSION);
KJS

100

उदाहरण URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

क) सुझाए गए असुरक्षित का उपयोग न करेंPATHINFO :

pathinfo($url)['dirname']   🡺 'http://example.com/myfolder'
pathinfo($url)['basename']  🡺 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
pathinfo($url)['extension'] 🡺 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
pathinfo($url)['filename']  🡺 'sympony'

बी) PARSE_URL का उपयोग करें :

parse_url($url)['scheme']   🡺 'http'
parse_url($url)['host']     🡺 'example.com'
parse_url($url)['path']     🡺 '/myfolder/sympony.mp3'
parse_url($url)['query']    🡺 'aa=1&bb=2'
parse_url($url)['fragment'] 🡺 'XYZ'

बोनस: सभी मूल PHP उदाहरण देखें


3
इस जवाब में सब कुछ शामिल है जैसे। एक फ़ाइल की तरह foo_folder/foo-file.jpg?1345838509बस के साथ बुरी तरह विफल हो जाएगा pathinfo, thanx

1
पूरी तरह से विषय पर नहीं, लेकिन यह मेरी समस्या को हल किया था यकीन है!
होवी

7
कुछ भी मत भूलना! parse_urlURL के लिए है और pathinfoफ़ाइल पथ के लिए है।
नबी काज

1
आपका क्या मतलब है "पथ जानकारी भूल जाओ"? आप इसका समाधान में उपयोग करें!
शरद लियोनार्ड

1
@AutumnLeonard वह नहीं करता है, वह सिर्फ pathinfo और parse_url के बीच अंतर दिखाता है।

59

यह भी है SplFileInfo:

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

अक्सर आप बेहतर कोड लिख सकते हैं यदि आप स्ट्रिंग के बजाय इस तरह के ऑब्जेक्ट को पास करते हैं। आपका कोड तब बोल रहा है। PHP 5.4 के बाद से यह एक-लाइनर है:

$ext  = (new SplFileInfo($path))->getExtension();

शानदार, इसकी सभी तरह की वस्तुएं :)
क्रिस्टोफर चेस

2
कृपया ध्यान रखें कि ->getExtension()PHP 5.3.6 के बाद से SplFileInfo में उपलब्ध है।
मथियास

1
@matthias: कृपया ध्यान रखें कि SPL को PHP संस्करणों में अक्षम किया जा सकता है जो PHP 5.3.0 रिलीज़ से पहले होता है। यदि आप अभी भी PHP 5.3 लेकिन 5.2 या उससे कम नहीं चला रहे हैं, तो यह उत्तर सबसे अधिक संभावना है कि स्थिर कोड के लिए फिट नहीं है। अन्यथा आप एक विशिष्ट PHP संस्करण की आवश्यकता के द्वारा अपने कोड को स्थिर कर सकते हैं और अन्यथा जमानत कर सकते हैं।
हकर्रे

@hakre जब आप यह कहने में सही होते हैं कि "इसे 5.3.0 से पहले वाले संस्करणों में अक्षम किया जा सकता है", SPL एक्सटेंशन को फिर भी PHP 5.0.0 के रूप में डिफ़ॉल्ट रूप से संकलित किया गया है। तो यह टिप्पणी वास्तव में PHP 5.2 या उससे कम का उपयोग करने के लिए मजबूर लोगों के लिए समझ में आता है और विशिष्ट एसपीएल वर्गों का उपयोग करके इस्तीफा नहीं देना चाहता है।
मत्ती

हाँ, बस मृत संस्करण फुलाना :)
hakre

23

फ़ाइल एक्सटेंशन को निर्धारित करने के लिए ई-सतीस की प्रतिक्रिया सही तरीका है।

वैकल्पिक रूप से, फ़ाइलों के विस्तार पर निर्भर होने के बजाय, आप MIME प्रकार की फ़ाइलों को निर्धारित करने के लिए फाइलइन्फो का उपयोग कर सकते हैं ।

यहां एक उपयोगकर्ता द्वारा अपलोड की गई छवि को संसाधित करने का एक सरल उदाहरण है:

// 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
यह केवल सही उत्तर है। मुझे समझ नहीं आता कि लोगों ने दूसरों को वोट क्यों दिया। हां, यह दृष्टिकोण डेवलपर से अधिक प्रयासों की मांग करता है लेकिन यह प्रदर्शन को बढ़ाता है (हालांकि बहुत कम है, लेकिन यह करता है)। कृपया उल्लेख इस
भाविक शाह

2
@ भाविक: कुछ मामलों में हमें केवल फ़ाइल एक्सटेंशन की आवश्यकता हो सकती है, वे माइम प्रकार की जाँच के बारे में हैं। लेकिन वास्तविक प्रश्न फ़ाइल एक्सटेंशन के बारे में है, फ़ाइल प्रकार के बारे में नहीं। तो यह इस सवाल का सबसे अच्छा जवाब नहीं है। (अभी तक एक जवाब)
ससी वरना कुमार

इस स्विच को एक अतिरिक्त कोष्ठक की आवश्यकता है
rsb2097

16

जब तक यह एक पथ शामिल नहीं करता है आप भी उपयोग कर सकते हैं:

array_pop(explode('.', $fname))

$fnameफ़ाइल का नाम कहां है, उदाहरण के लिए my_picture.jpg:। और परिणाम होगा:jpg


@ यह 3 डाउनवोट है? इसका उचित परिणाम मिल रहा है। कृपया समझाएं
railsbox

यह गलत नहीं है, यह करने का सबसे अच्छा तरीका नहीं है। थोड़ा संतुलन के लिए उत्कीर्ण।

यह सबसे अच्छा तरीका है, जब आपको वास्तविक विस्तार की आवश्यकता होती है और फ़ाइल नाम में कई और हो सकते हैं, जैसे उपयोगकर्ता ने मेरे मामले में फ़ोटो अपलोड किए हैं।
रौली राजंडे

2
यदि फ़ाइल नाम का कोई विस्तार नहीं है, तो यह विफल हो जाता है। "Myfile" में पास होने का प्रयास करें और यह "myfile" वापस आ जाएगा। सही वापसी मूल्य इस उपयोग के मामले में विस्तार के रूप में एक खाली स्ट्रिंग है।
शाम

यह उस सरणी में गलत है जो array_pop () नोटिस को फेंक देगा क्योंकि यह एक पॉइंटर को इसके पैरामीटर के रूप में लेता है।
जुलिटिक्स

12

1) यदि आप उपयोग कर रहे हैं (PHP 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, पीएचपी 5) है 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"

// EDIT: एक ब्रैकेट हटाया


12

कभी-कभी उपयोग न करने के लिए यह उपयोगी है pathinfo($path, PATHINFO_EXTENSION)। उदाहरण के लिए:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

यह भी ध्यान दें कि pathinfoकुछ गैर-एएससीआईआई पात्रों को संभालने में विफल रहता है (आमतौर पर यह उन्हें आउटपुट से दबा देता है)। विस्तार में, जो आमतौर पर कोई समस्या नहीं है, लेकिन यह उस चेतावनी के बारे में पता करने के लिए चोट नहीं करता है।


6
@ ई-सिटिस: विकिपीडिया के अनुसार वे दो एक्सटेंशन हैं: यूनिक्स-जैसे फाइल सिस्टम अलग-अलग मॉडल मेटाडेटा के बिना एक अलग मॉडल का उपयोग करते हैं। डॉट चरित्र मुख्य फ़ाइल नाम में सिर्फ एक और चरित्र है, और फ़ाइल नाम में कई एक्सटेंशन हो सकते हैं, आमतौर पर नेस्ट ट्रांसफॉर्मेशन का प्रतिनिधित्व करते हैं, जैसे कि files.tar.gz
एलिक्स एक्सल

1
और अगर हमारे पास उत्पाद के नाम में डॉट है? Ex:test.19-02-2014.jpeg
मारियो रेडोमनाना

यह /root/my.folder/my.css के साथ विफल हो जाएगा ltrim(strrchr($PATH, '.'),'.'), pathinfo की तरह काम करता है, लेकिन सब कुछ टोकन के बिना।
रे फॉस


8

आप इसे भी आज़मा सकते हैं (यह PHP 5. * और 7 पर काम करता है):

$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip

युक्ति: यदि फ़ाइल में एक्सटेंशन नहीं है, तो यह एक रिक्त स्ट्रिंग देता है


7

क्षमा करें ... "लघु प्रश्न? लेकिन लघु उत्तर नहीं"

उदाहरण 1 पथ के लिए

$path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
$name = pathinfo($path, PATHINFO_FILENAME);
$ext  = pathinfo($path, PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

URL के लिए उदाहरण 2

$url = "//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
$url = parse_url($url);
$name = pathinfo($url['path'], PATHINFO_FILENAME);
$ext  = pathinfo($url['path'], PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

उदाहरण 1 का आउटपुट:

Name: base.min
Extension: css

उदाहरण 2 का आउटपुट:

Name: file.bak
Extension: php

संदर्भ

  1. https://www.php.net/manual/en/function.pathinfo.php

  2. https://www.php.net/manual/en/function.realpath.php

  3. https://www.php.net/manual/en/function.parse-url.php


6

एक त्वरित सुधार कुछ इस तरह होगा।

// Exploding the file based on the . 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];

फंक्शन के लिए बनाए गए php का उपयोग क्यों न करें php.net/manual/en/function.pathinfo.php लंबे कोड का उपयोग करने के बजाय
शहबाज

1
शाहबाज़ की बात के अलावा आप $file_ext = end(explode('.', $filename));इस जवाब में चार के बजाय एक लाइन में सब कुछ करने के लिए भी कर सकते हैं ।
टीवी

@Amelia क्या अगर आपके पास .tar.gz। यह काम नहीं करेगा, इसलिए यदि आपको विस्तार का पूरा उपयोग करने की आवश्यकता है जैसे कि ltrim(strstr($filename, '.'), '.');बिना विस्तार के पूर्ण रूप से प्राप्त करने के लिए gz
मारिन सगोवेक


6

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";

5
substr($path, strrpos($path, '.') + 1);

1
यह /root/my.folder/my.css के साथ विफल हो जाएगा
रे

1
इसे सही ढंग से काम करना चाहिए: पदार्थ ($ पथ, स्ट्र्रैप ($ पथ, '।') + 1); नोट: यह विधि ऊपर दिए गए किसी भी अन्य समाधान की तुलना में तेज़ है। हमारी स्वयं की स्क्रिप्ट का उपयोग करके एक बेंचमार्क आज़माएं।
अब्बास


4
ltrim(strstr($file_url, '.'), '.')

यह सबसे अच्छा तरीका है यदि आपके पास name.name.name.ext (बदसूरत) जैसे फ़ाइलनाम हैं, लेकिन यह कभी-कभी होता है



3

मैंने पाया कि स्थानीय फ़ाइल सिस्टम पर मानक फ़ाइलों के लिए समाधान pathinfo()और SplFileInfoसमाधान अच्छी तरह से काम करते हैं, लेकिन यदि आप दूरस्थ फ़ाइलों के साथ काम कर रहे हैं, तो आप मुश्किलों में भाग सकते हैं, क्योंकि वैध चित्रों के URL में #(खंड पहचानकर्ता) और / या ?(क्वेरी पैरामीटर) हो सकते हैं 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()

3

का उपयोग करें substr($path, strrpos($path,'.')+1);। यह सभी तुलनाओं का सबसे तेज़ तरीका है।

@ कर्ट झोंग ने पहले ही जवाब दे दिया।

आइए तुलनात्मक परिणाम यहां देखें: https://eval.in/661574


2

आप किसी विशेष फ़ोल्डर में सभी फ़ाइल एक्सटेंशन प्राप्त कर सकते हैं और एक विशिष्ट फ़ाइल एक्सटेंशन के साथ संचालन कर सकते हैं:

<?php
    $files = glob("abc/*.*"); // abc is the 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 particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>

2

इसे जल्दी करो।

निम्न स्तर की कॉल बहुत तेज़ होने की आवश्यकता है इसलिए मुझे लगा कि यह कुछ शोध के लायक है। मैंने कुछ तरीकों की कोशिश की (विभिन्न स्ट्रिंग लंबाई के साथ, विस्तार की लंबाई, प्रत्येक में कई रन), यहां कुछ उचित हैं:

function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}

परिणाम बहुत आश्चर्यजनक नहीं थे। गरीब pathinfo(अब तक!) सबसे धीमा (ऐसा लगता है कि वह पूरी चीज़ को पार्स करने की कोशिश कर रहा है और फिर सभी अनावश्यक भागों को छोड़ देता है) - और method3()(स्ट्रैप) सबसे तेज़ है, अब तक:

Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:

    Method 1:   312.6 mike  (response: txt) // preg_replace
    Method 2:   472.9 mike  (response: txt) // preg_match
    Method 3:   167.8 mike  (response: txt) // strrpos
    Method 4:   340.3 mike  (response: txt) // explode
    Method 5:  2311.1 mike  (response: txt) // pathinfo  <--------- poor fella

नोट: पहली विधि का एक साइड इफेक्ट है: जब कोई विस्तार नहीं होता है तो यह पूरा नाम वापस कर देता है। निश्चित रूप से इस व्यवहार से बचने के लिए एक अतिरिक्त स्ट्रैप के साथ इसे मापने का कोई मतलब नहीं होगा।

निष्कर्ष

यह समुराई के रास्ते की तरह दिखता है:

function fileExtension($s) {
    $n = strrpos($s,".");
    return ($n===false) ? "" : substr($s,$n+1);
}

1

यदि आप गति की तलाश कर रहे हैं (जैसे कि राउटर में), तो आप शायद सब कुछ टोकन नहीं करना चाहते हैं। कई अन्य उत्तर के साथ विफल हो जाएगा/root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');

1

यद्यपि "सबसे अच्छा तरीका" बहस योग्य है, मेरा मानना ​​है कि यह कुछ कारणों से सबसे अच्छा तरीका है:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. यह एक एक्सटेंशन के लिए कई हिस्सों के साथ काम करता है, जैसे tar.gz
  2. संक्षिप्त और कुशल कोड
  3. यह एक फ़ाइल नाम और पूर्ण पथ दोनों के साथ काम करता है

1

IMO, यह सबसे अच्छा तरीका है अगर आपके पास name.name.name.ext (बदसूरत जैसे फ़ाइल नाम हैं, लेकिन कभी-कभी ऐसा होता है):

$ext     = explode('.', $filename); // Explode the string
$ext_len = count($ext) - 1; // Count the array -1 (because count() starts from 1)
$my_ext  = $ext[$ext_len]; // Get the last entry of the array

echo $my_ext;

1

$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);

preg_replace दृष्टिकोण हम नियमित अभिव्यक्ति खोज और प्रतिस्थापित का उपयोग कर रहे हैं। Preg_replace फ़ंक्शन में पहला पैरामीटर खोज का पैटर्न है, दूसरा पैरामीटर $ 1 जो पहले (। *) से मेल खाता है उसका संदर्भ है और तीसरा पैरामीटर फ़ाइल नाम है।

एक अन्य तरीका, हम '' की अंतिम घटना की स्थिति का पता लगाने के लिए स्ट्रैप का उपयोग कर सकते हैं। '' फ़ाइल नाम में और उस स्थिति को 1 से बढ़ाएँ ताकि वह (।) से स्ट्रिंग में विस्फोट हो जाए।

$ext = substr($fileName, strrpos($fileName, '.') + 1);


0

दरअसल, मैं उसी की तलाश में था।

<?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);

-1

उपयोग

str_replace('.', '', strrchr($file_name, '.'))

एक त्वरित एक्सटेंशन पुनर्प्राप्ति के लिए (यदि आप जानते हैं कि आपके फ़ाइल नाम में एक है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.