\Ke\UtilsPathHelper

路径处理助手

这个的方法方法实现,参数为 $ds 的,表明该参数必须是目录分隔符,也即 PathHelper::DS_WINPathHelper::DS_UNIX 其中之一。

参数命名为 $spr ,表明该参数可以指定除了目录分隔符以外的字符串,但因为处理机制的问题,该参数只支持 1 位长度字符串,超出的会截取掉保留首位的字符串。

Summary

Methods
Properties
Constants
absolute()
purge()
convertDirectorySeparator()
prepareDirectory()
split()
detectPhar()
compare()
No public properties found
DEFAULT_PATH_NOISE
DS_WIN
DS_UNIX
DOT_REMOVE
DOT_ORIGINAL
DOT_NORMALIZE
LEFT_REMOVE
LEFT_ORIGINAL
LEFT_FILL
RIGHT_REMOVE
RIGHT_ORIGINAL
RIGHT_FILL
LR_REMOVE
LR_ORIGINAL
LR_FILL
PURGE_ALL_VALUE
No protected methods found
$purgeMode
$ds
$noise
$pathMaps
N/A
No private methods found
No private properties found
N/A

Constants

DEFAULT_PATH_NOISE

DEFAULT_PATH_NOISE = '/\\ ' : string

DS_WIN

DS_WIN = '\\' : string

DS_UNIX

DS_UNIX = '/' : string

DOT_REMOVE

DOT_REMOVE = 0 : integer

DOT_ORIGINAL

DOT_ORIGINAL = 2 : integer

DOT_NORMALIZE

DOT_NORMALIZE = 3 : integer

LEFT_REMOVE

LEFT_REMOVE = 0 : integer

LEFT_ORIGINAL

LEFT_ORIGINAL = 8 : integer

LEFT_FILL

LEFT_FILL = 12 : integer

RIGHT_REMOVE

RIGHT_REMOVE = 0 : integer

RIGHT_ORIGINAL

RIGHT_ORIGINAL = 32 : integer

RIGHT_FILL

RIGHT_FILL = 48 : integer

LR_REMOVE

LR_REMOVE = 0

LR_ORIGINAL

LR_ORIGINAL = self::LEFT_ORIGINAL | self::RIGHT_ORIGINAL : integer

LR_FILL

LR_FILL = self::LEFT_FILL | self::RIGHT_FILL : integer

PURGE_ALL_VALUE

PURGE_ALL_VALUE = 63 : integer

Properties

$purgeMode

$purgeMode : integer

Type

integer — 默认的 purge 处理模式,该参数预留给实际项目中重载时,调节参数使用。

$ds

$ds : string

Type

string — 默认的目录分隔符

$noise

$noise : string

Type

string — 类实例默认的路径噪音字符,这个 $noise 可被后继的类重载,使用上和 `PathHelper::DEFAULT_PATH_NOISE` 不同

$pathMaps

$pathMaps : array

Type

array — 已经生成的 `路径 => 绝对路径` 的映射,这里会存在 访问名不同(绝对路径或相对路径),但绝对路径的值相同可能性,所以以访问的路径名作为 key

Methods

absolute()

absolute(string  $path) : string

生成一个路径的绝对路径(php的realpath方法)

  • 调整默认 realpath 函数不支持 phar 包内文件的结果。
  • 统一将所有的目录分隔符转化为统一的目录分隔符(根据 $this->ds)。

Parameters

string $path

Returns

string

purge()

purge(string  $path, integer|null  $mode = null, string|null  $spr = null, string|null  $trimNoise = null) : string

净化路径值

  1. 根据指定的 $spr 替换为统一的目录分隔符
  2. 去掉多余重复的 $spr
  3. 依据 $dotMode 过滤(或不处理) 路径值中的 /../
  4. 依据 $leftMode 是否补充(或强制填充,或强制截取) 最开始的目录分隔符(尤其是对于绝对路径),Windows风格的路径值不受该参数影响。

基于上一个版本的kephp的全局函数 purge_path 方法,优化了 $mode 参数。

去掉了默认的 urldecode ,所以处理 Url 的路径时,请自行先行进行 decode。

$mode 用于说明一个路径净化处理时的三个处理模式:

  • dotMode - 路径中的 ../ ./ 的处理模式:
    • PathHelper::DOT_REMOVE - 默认值,强制删除路径中点,忽略其意义
    • PathHelper::DOT_ORIGINAL - 维持原状,不做处理。
    • PathHelper::DOT_NORMALIZE - 常规化处理,即将 ../ 向前一层的目录递进, ./ 则删除。
  • leftMode & rightMode - 路径头尾的目录分隔符的处理方式:
    • PathHelper::LEFT_REMOVE PathHelper::RIGHT_REMOVE - 默认值,强制去除最左边或最右边的分隔符
    • PathHelper::LEFT_ORIGINAL PathHelper::RIGHT_ORIGINAL - 最左边或最右边的分隔符维持原状(原来有就有,原来没有就没有)
    • PathHelper::LEFT_FILL PathHelper::RIGHT_FILL - 最左边或最右边的分隔符强制填充(原来没有也会强制加上)

PathHelper::LR_REMOVE = PathHelper::LEFT_REMOVE | PathHelper::RIGHT_REMOVE - 左右两边都删除 PathHelper::LR_ORIGINAL = PathHelper::LEFT_ORIGINAL | PathHelper::RIGHT_ORIGINAL - 左右两边都维持原状 PathHelper::LR_FILL = PathHelper::LEFT_FILL | PathHelper::RIGHT_FILL - 左右两边都填充

$mode = PathHelper::DOT_ORIGINAL | PathHelper::LR_REMOVE; // 路径中的点维持原状,左右两边的分隔符删除
$mode = PathHelper::DOT_REMOVE | PathHelper::LR_FILL; // 路径中的点强制删除,左右两边的分隔符强制填充

调用示例:

$helper = new PathHelper();
$helper->purge('a/b/c', PathHelper::LR_FILL); // => /a/b/c/
$helper->purge('-a---b---..--.---c-d---', PathHelper::DOT_REMOVE | PathHelper::LR_REMOVE, '-'); // => a-b-c-d

更多示例代码,请参阅 Test_PathHelper

该方法支持通过 $spr 指定其他的分隔符,但分隔符只支持 1 位长度字符串,如果超出,会只取该字符的 0 的字符值作为 $spr。

Parameters

string $path

要净化处理的路径值

integer|null $mode

净化的处理模式,参考 PathHelper 的常量说明

string|null $spr

目录分隔符,可以指定其他的分隔符

string|null $trimNoise

路径处理的噪音字符串

Returns

string

convertDirectorySeparator()

convertDirectorySeparator(string  $path, string|null  $ds = null) : string

转换路径中的目录分隔符

该方法不支持 Unix 或 Windows 风格以外的目录分隔符。

Parameters

string $path

要转换的路径

string|null $ds

目录分隔符,这里只允许是 Unix 或 Windows 风格的目录分隔符,不支持其他。

Returns

string —

返回统一转换过的路径名

prepareDirectory()

prepareDirectory(string  $path, boolean  $isDir = false, integer  $mode = 493) : false|string

指定一个路径,为该路径预备建立所需的目录(递归)

  • 如果该路径是一个文件路径,则建立该文件所需的目录(dirname)。
  • 如果是一个目录路径,则建立整个路径。

Parameters

string $path

一个要写入的文件路径,或者是一个目录的路径

boolean $isDir

说明 $path 是一个文件路径还是一个目录路径

integer $mode

创建目录的权限值

Returns

false|string —

返回所创建的(或者本身目录已经存在的)目录的绝对路径,如果创建失败或者传入的路径名有误,返回 false

split()

split(string  $path) : array

将一个路径分离(解析)出目录名、文件名、文件后缀名(强制转小写)、无后缀文件名

  • 该方法不包含purge,请先自行purge。
  • 该方法也不会统一转换目录的分隔符,请先自行转换。
  • 该方法解析路径时,以最右边(末尾)是否为一个目录分隔符,作为识别该路径是否是一个目录的路径,还是一个文件的路径。目录路径时,文件名、文件后缀名、无后缀文件名皆为 null。
  • 该方法提取 文件后缀名 的规则,为文件名部分最右边的 . 之后(不含 . )的字符串
  • 提取出的 文件后缀名 ,会强制转为小写保存(但解析出的 文件名 不会做此处理)
path('/var/log/'); // => 表示为一个目录路径,结果:['/var/log', null, null, null]
path('/var/log'); // => 表示为一个文件路径,结果:['/var', ‘log’, null, 'log']
path('/var/log/nginx.log'); // => 表示为一个文件路径,结果:['/var/log', ‘nginx.log’, 'log', 'nginx']

// 文件名不会进行大小写转换处理,但是提取出来的后缀文件名,会强制转为小写
path('/var/log/nginx.LOG'); // => 表示为一个文件路径,结果:['/var/log', ‘nginx.LOG’, 'log', 'nginx']

// 后缀名匹配,为右匹配的模式
path('/var/log/nginx.20180930.log'); // => 表示为一个文件路径,结果:['/var/log', ‘nginx.20180930.log’, 'log', 'nginx.20180930']

注意:由于风格的问题,dirname 强制去除了最末尾的 目录分隔符。

Parameters

string $path

Returns

array —

返回数据格式:[dirname, filename, extname, basename]

detectPhar()

detectPhar(string  $path) : array

侦测一个路径是否为包含phar协议的路径值

Parameters

string $path

Returns

array —

返回结果 [移除phar的路径名, 是否phar]

compare()

compare(string|null  $source = null, string|null  $target = null, string|null  $delimiter = null, string|null  $prefix = null, string|null  $noise = null) : string

比较两个路径,返回相同的部分

必须确保两个传入的路径都是被净化处理过的路径名,不包含类如/../,并且请确保传入的路径都有一致的目录分隔符。 本函数不会自动调用purge的函数,请调用前自己执行

compare_path('/aa/bb/cc', '/aa/bb/dd'); // => aa/bb

// 这个函数还可以用于挑出两个字符串相同的部分
compare_path('ab-cd-ef-gh-ij', 'ab-cd-ef-gh-abc', '-'); // => ab-cd-ef-gh

Parameters

string|null $source
string|null $target
string|null $delimiter
string|null $prefix
string|null $noise

Returns

string