微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将几乎一致的文件名解析为有意义的部分?

如何解决如何将几乎一致的文件名解析为有意义的部分?

我的文件名如下:

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,'D'])

的明智用法是:

   array_diff_key([0,3])

因此,implode的最终结果是4,7个键的值的串联。

要将第二个参数数组的值作为键,可以使用array_flip将键作为值,将值作为键,并使用以下表达式:

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

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

,

我担心您会使这个问题变得过于复杂。我认为单个preg_match()调用是解析字符串的最直接方法。

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

pathinfo($filename',PATHINFO_FILENAME)

现在扩展已被删除,让我们继续分析。

代码:(Demo

$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()感到不安,则该模式将变得非常简单,但是还有更多要做的事情。

代码:(Demo

$filename = '1234_56_78 A_FAIRLY_SHORT_TITLE_D.pdf';
$m = preg_split('~ |_~',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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。