如何解决如何将几乎一致的文件名解析为有意义的部分?
我的文件名如下:
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])));
,
我担心您会使这个问题变得过于复杂。我认为单个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 举报,一经查实,本站将立刻删除。