如何将一个基本一致的文件名解析为有意义的部分



我的文件名如下:

1234_56_78 A_FAIRLY_SHORT_TITLE_D.pdf

幸运的是,文件命名非常一致,但我不能绝对保证有人没有在应该使用下划线的地方使用空格。

考虑到这一点,我想解析字符串并提取以下详细信息:

$project_no = '1234
$series_no = '56
$sheet_no = '78'
$revision = 'D'
$title = 'A Fairly Short Title' 

目前,我使用以下来获取此信息:

$filename = $_FILES['file']['name'][$i];
$filename = preg_replace('/\.[^.\s]{3,4}$/', '', $filename);
$parts = preg_split( "(_| )", $filename );
$project_no = $parts[0];
$series_no = $parts[1];
$sheet_no = $parts[2];
$revision = end($parts);

$title只是删除$parts[0]$parts[1]$parts[2]end($parts)后剩下的所有内容,但我应该如何表达呢?

我想我可能会使用

$title = implode(' ',array_diff_key($parts, [0,1,2,end($parts)]));

但这并没有删除最后的$revision位。。。

$title = FLOOR AS PROPOSED D

我错过了什么?我是否不必要地使这件事复杂化了?

array_diff_key查看两个数组的关键字比较。end()只是移动数组的内部指针,实际上是无用的,因为它返回的值不能用于计算两个数组键之间的差异。

当前比较表现为

array_diff_key([0,1,2,3,4,5,6,7], [0,1,2,'D'])

顺序,它看起来是:

array_diff_key([0,1,2,3,4,5,6,7], [0,1,2,3])

因此,implode的最终结果是4,5,6,7密钥的值的级联。

要将第二个参数数组值设置为键,可以使用array_flip将键设置为值,将值设置为密钥,表达式如下:

$title = implode(' ',array_diff_key($parts, array_flip([0,1,2,count($parts)-1])));

演示:https://3v4l.org/J6b5r

我担心你把这件事搞得太复杂了。我认为单个preg_match()调用是解析字符串的最直接方法。

看起来您从https://stackoverflow.com/a/2395905/2943403从文件名中删除扩展名;但是,当单个非正则表达式函数具有相同的目的时,我建议使用正则表达式函数。

pathinfo($filename', PATHINFO_FILENAME)

既然已经删除了扩展,让我们继续解析。

代码:(演示(

$filename = '1234_56_78 A_FAIRLY_SHORT_TITLE_D.pdf';
preg_match('~([^ _]+)[ _]([^ _]+)[ _]([^ _]+)[ _](.+)[ _](S)~', pathinfo($filename, PATHINFO_FILENAME), $m);
var_export([
'project_no' => $m[1],
'series_no' => $m[2],
'sheet_no' => $m[3],
'title' => str_replace('_', ' ', $m[4]),
'revision' => $m[5],
]);

输出:

array (
'project_no' => '1234',
'series_no' => '56',
'sheet_no' => '78',
'title' => 'A FAIRLY SHORT TITLE',
'revision' => 'D',
)

如果你在使用preg_split()时犹豫不决,那么模式就会变得超级简单,但还有更多的清理工作要做。

代码:(演示(

$filename = '1234_56_78 A_FAIRLY_SHORT_TITLE_D.pdf';
$m = preg_split('~ |_~', pathinfo($filename, PATHINFO_FILENAME));
$revision = array_pop($m);
var_export([
'project_no' => $m[0],
'series_no' => $m[1],
'sheet_no' => $m[2],
'title' => implode(' ', array_slice($m, 3)),
'revision' => $revision,
]);
// same output as earlier snippet

相关内容

  • 没有找到相关文章

最新更新