dixflatlinr / fname
这个方便的文件名操作库使得文件名的操作变得简单
1.3.0
2023-09-17 02:04 UTC
Requires
- php: >=7.4.0
- dixflatlinr/preg_return: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9
README
~ 提供了一种简单操作文件名的方法。方便地更改路径、文件名主体和扩展名。
安装
将 FName 包含到您的项目的最佳方式是使用 Composer。
composer require dixflatlinr/fname
细节... 我很匆忙
<?php use \DF\App\FName\FName; require 'vendor/autoload.php'; $f = FName::make('/easy/path/file.ext'); # /easy/path/file.ext $f->path('/var/www')->body('%_readme')->ext('txt'); # /var/www/file_readme.txt
一般信息和术语
文件名有三个部分:一个 路径,一个 文件名主体,和一个 扩展名。您可以单独操作每一部分,而不会影响其他部分。每一部分都可以为空。
PATH
/var/www/
filename.ext
- 总是以斜杠结尾(如果省略,将自动插入)
- 不允许有 null 字节
FILENAME BODY
/var/www/
filename
.ext
- 不允许有 null 字节和斜杠
EXTENSION
/var/www/filename.
ext
- 不允许有 null 字节、斜杠和点
示例
<?php use \DF\App\FName\FName; require 'vendor/autoload.php'; $filename = '/hevy/path/filebody.info.ext';
实例化和查询部分
$f = FName::make($filename); $f = new FName($filename); $f = FName::makeByParts('/hevy/path/','filebody.info','ext'); (string)$f; # /hevy/path/filebody.info.ext $f->path; # /hevy/path/ $f->body; # filebody.info $f->ext; # ext $f->extLong # info.ext
操作部分
FName::make('/hevy/path/filebody.ext') ->path('/var/www') # /var/www/filebody.ext ->body('%.indy') # /var/www/filebody.indy.ext ->ext('mp4'); # /var/www/filebody.indy.mp4 ->filename('newfile.ext') # /var/www/newfile.ext FName::make('') ->set('/','readme','txt'); # /readme.txt
使用占位符生成文件名
FName::make('/var/www/pugs_attacking.jpg') ->gen('%Pnewfilename%X'); # /var/www/newfilename.jpg /* * %A - Full filename => /var/www/pugs_attacking.jpg * %P - Path => /var/www/ * %F - Filename (body and ext) => pugs_attacking.jpg * %B - Filename body => pugs_attacking * %E - Filename extension without dot => jpg * %X - Filename extension with dot => .jpg * %L - Filename long extension => jpg */
标志
FLAG_DISABLE_PLACEHOLDER
占位符字符 (%) 不会被转换为文件名部分
FName::make('filename.ext', FName::FLAG_DISABLE_PLACEHOLDER) ->body('%leftalone'); # %leftalone.ext
FLAG_DISABLE_SMARTPATH
相邻路径目录分隔符将被保留原样
FName::make('',FName::FLAG_DISABLE_SMARTPATH) ->path('/var/www//slashes///'); #/var/www//slashes///
特性
//A path, no filename $filename = '/var/www/whatever/'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['/var/www/whatever/','',''], [$f->path, $f->body, $f->ext]); //A path's last segment without an ending slash is interpreted as a filename $filename = '/var/www/whatever'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['/var/www/','whatever',''], [$f->path, $f->body, $f->ext]); //Full path, with filename, without extension $filename = '/var/www/whatever/filename'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['/var/www/whatever/','filename',''], [$f->path, $f->body, $f->ext]); //Full path, with filename and extension $filename = '/var/www/whatever/filename.ext'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['/var/www/whatever/','filename','ext'], [$f->path, $f->body, $f->ext]);
//double dots is a filename without extension (body only) $filename = '..'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['','..',''], [$f->path, $f->body, $f->ext]); //single dot is a filename without extension (body only) $filename = '.'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['','.',''], [$f->path, $f->body, $f->ext]); //lots of dots is still considered a filename without extension (body only) $filename = '......'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['','......',''], [$f->path, $f->body, $f->ext]); //lots of dots as body with an added extension - last dot is always consumed when separating the extension $filename = '......ext'; $f = new FName($filename); $this->assertEqualsCanonicalizing(['','.....','ext'], [$f->path, $f->body, $f->ext]); //Multiple dots in filename $filename = '/var/www/whatever/flying...pugs.plus.the.birds...ext'; $f = new FName($filename); $this->assertEqualsCanonicalizing ( ['/var/www/whatever/','flying...pugs.plus.the.birds..','ext'], [$f->path, $f->body, $f->ext] );