PHP将文件复制/发送到正确的文件夹中
我有很多文件的名称如下:PHP将文件复制/发送到正确的文件夹中,php,regex,Php,Regex,我有很多文件的名称如下: TRK#112工作日#5来自#BOB#UUUU Tender#U P582895zdf112 TRK#WeekDay#5来自#BOB#Uuuu Tender#p58895ZDF152 TRK#115工作日#5来自#BOB#UUUU Tender#U P582895zdf714 我想将每个文件发送到它自己的文件夹 例如: TRK#112工作日#5来自#BOB#uu Tender(招标人)P582895zdf112 会进入112号文件夹 而且 TRK#平日#5 From#
TRK#112工作日#5来自#BOB#UUUU Tender#U P582895zdf112
TRK#WeekDay#5来自#BOB#Uuuu Tender#p58895ZDF152
TRK#115工作日#5来自#BOB#UUUU Tender#U P582895zdf714
我想将每个文件发送到它自己的文件夹
例如:
TRK#112工作日#5来自#BOB#uu Tender(招标人)P582895zdf112
会进入112号文件夹
而且
TRK#平日#5 From#BOB#uuuuu Tender(p58895zdf152)
不会去任何地方,因为TRK#是空的/缺失的或它不是一个数字。如果不是数字,跳过它
及
TRK#115 WeekDay#5来自#BOB#uuuuu Tender(up582895zdf714)
将进入文件夹115您可以使用来提取数字,然后您可以使用来制作实际的文件系统副本:
function doCopy($file) {
preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
if (empty($matches[1])) { // no number, skip it
return false;
}
$folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
if (! is_dir($folder)) { // target directory doesn't exist: make it
mkdir($folder);
}
$target = $folder . DIRECTORY_SEPARATOR . basename($file);
echo "Copying '$file' into '$target'" . PHP_EOL;
return copy($file, $target); // actually copy now
}
然后,使用此函数对文件进行循环,结果如下:
$files = [
'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112',
'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152',
'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714',
];
foreach ($files as $file) {
$copied = doCopy($file);
if (! $copied) {
echo "Did not copy $file" . PHP_EOL;
}
}
“魔力”在正则表达式中,表示匹配:
empty
test-,并将其复制到一个名为匹配值的目录中。我们在玩杂耍时必须小心。首先,目标目录必须存在。其次,我们需要确保copy
可以在适当的目录中找到原始文件,并为其指定一个包含文件名的目标。超过一半的逻辑都用于此开销
在Linux计算机上运行的示例:
$ mkdir test
$ touch test/'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
$ touch test/'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf'
$ touch test/'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
$ cat example.php
<?php
function doCopy($file) {
preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
if (empty($matches[1])) {
return false;
}
$folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
if (! is_dir($folder)) {
mkdir($folder);
}
$target = $folder . DIRECTORY_SEPARATOR . basename($file);
echo "Copying '$file' into '$target'" . PHP_EOL;
return copy($file, $target);
}
$files = glob('test/*.pdf');
foreach ($files as $file) {
$copied = doCopy($file);
if (! $copied) {
echo "Did not copy $file" . PHP_EOL;
}
}
$ php example.php
Copying 'test/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf' into 'test/112/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
Copying 'test/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf' into 'test/115/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
Did not copy test/TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf
$ tree test/
test/
├── 112
│ └── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
├── 115
│ └── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
├── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
├── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
└── TRK#\ WeekDay#\ 5\ From#\ BOB___Tender_P588895zdf152.pdf
$mkdir测试
$touch test/'TRK#112工作日#5来自"BOB"Tender"P582895zdf112.pdf"
$touch test/'TRK#平日#5来自#BOB#uuuu Tender_p58895ZDF152.pdf'
$touch test/'TRK#115个工作日#5来自#BOB#uuuu Tender(P582895zdf714.pdf)
$cat example.php
您可以使用提取数字,然后使用创建实际的文件系统副本:
function doCopy($file) {
preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
if (empty($matches[1])) { // no number, skip it
return false;
}
$folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
if (! is_dir($folder)) { // target directory doesn't exist: make it
mkdir($folder);
}
$target = $folder . DIRECTORY_SEPARATOR . basename($file);
echo "Copying '$file' into '$target'" . PHP_EOL;
return copy($file, $target); // actually copy now
}
然后,使用此函数对文件进行循环,结果如下:
$files = [
'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112',
'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152',
'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714',
];
foreach ($files as $file) {
$copied = doCopy($file);
if (! $copied) {
echo "Did not copy $file" . PHP_EOL;
}
}
“魔力”在正则表达式中,表示匹配:
文本字符串“TRK”
后跟任意数量的空格
后跟文字字符串“#”
后跟任意数量的空格
后跟任意数量的数字——同时捕获匹配的数字
然后,我们检查是否有匹配的数字-empty
test-,并将其复制到一个名为匹配值的目录中。我们在玩杂耍时必须小心。首先,目标目录必须存在。其次,我们需要确保copy
可以在适当的目录中找到原始文件,并为其指定一个包含文件名的目标。超过一半的逻辑都用于此开销
在Linux计算机上运行的示例:
$ mkdir test
$ touch test/'TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
$ touch test/'TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf'
$ touch test/'TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
$ cat example.php
<?php
function doCopy($file) {
preg_match('/TRK\s*#\s*(\d+)/', $file, $matches);
if (empty($matches[1])) {
return false;
}
$folder = dirname($file) . DIRECTORY_SEPARATOR . $matches[1];
if (! is_dir($folder)) {
mkdir($folder);
}
$target = $folder . DIRECTORY_SEPARATOR . basename($file);
echo "Copying '$file' into '$target'" . PHP_EOL;
return copy($file, $target);
}
$files = glob('test/*.pdf');
foreach ($files as $file) {
$copied = doCopy($file);
if (! $copied) {
echo "Did not copy $file" . PHP_EOL;
}
}
$ php example.php
Copying 'test/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf' into 'test/112/TRK# 112 WeekDay# 5 From# BOB___Tender_P582895zdf112.pdf'
Copying 'test/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf' into 'test/115/TRK# 115 WeekDay# 5 From# BOB___Tender_P582895zdf714.pdf'
Did not copy test/TRK# WeekDay# 5 From# BOB___Tender_P588895zdf152.pdf
$ tree test/
test/
├── 112
│ └── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
├── 115
│ └── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
├── TRK#\ 112\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf112.pdf
├── TRK#\ 115\ WeekDay#\ 5\ From#\ BOB___Tender_P582895zdf714.pdf
└── TRK#\ WeekDay#\ 5\ From#\ BOB___Tender_P588895zdf152.pdf
$mkdir测试
$touch test/'TRK#112工作日#5来自"BOB"Tender"P582895zdf112.pdf"
$touch test/'TRK#平日#5来自#BOB#uuuu Tender_p58895ZDF152.pdf'
$touch test/'TRK#115个工作日#5来自#BOB#uuuu Tender(P582895zdf714.pdf)
$cat example.php
这将主要是一个正则表达式任务。你对正则表达式了解多少?@Goose谢谢你的时间。bishop也在帮助我,但看起来我们遇到了操作系统问题。我认为他有一个非常有希望的解决方案,但还没有奏效。如果你能看一下,那就太好了!再次感谢。这将主要是一个正则表达式任务。你对正则表达式了解多少?@Goose谢谢你的时间。bishop也在帮助我,但看起来我们遇到了操作系统问题。我认为他有一个非常有希望的解决方案,但还没有奏效。如果你能看一下,那就太好了!再次感谢。