我有一个存储数千个图片文件的文件夹。 我想更改与条件匹配的每个文件的名称。 我们的想法是,如果文件名 _10 更改为 _ten ,如果 _5 更改为 _five 。 因此, xxdf23_10hy.jpg 应 xxdf23_tenhy.jpg , 16_5_gt5.jpg 应更改为 16_five_gt5.jpg 。但如果文件鬃毛是 gdjd_7.jpg ,则什么也不做。
代码运行良好,但它匹配不应匹配的字符串“..”。
这是代码的一部分:
$photoPath="../pic/";
$dir = new DirectoryIterator($photoPath);
foreach ($dir as $fileinfo) {
$filename = $fileinfo->getFilename();
if(preg_match($filename, "/_10/")){
//change te name to "_ten"
}
elseif(preg_match($filename, "/_5/")){
//change te name to "_five"
}
}
我使用preg_match函数的方式不太好。 但如果我在regex tester里面尝试它,那就行得很好。
我错过了什么?
答案 0 :(得分:3)
您已经在preg_match()命令中切换了主题和模式。试试这个:
if (preg_match("/_10/", $filename)) {
// more code
}
答案 1 :(得分:1)
根本不需要正则表达式的开销。也许简单的glob()
和str_replace()
可以满足您的需求。
$photoPath="../pic/";
$replacements = array(
'_5' => '_five',
'_10' => '_ten'
);
foreach ($replacements as $pattern => $replace) {
$files = glob($photoPath . '*' . $pattern . '*');
foreach($files as $file) {
$old_name = $file;
$new_name = str_replace($pattern, $replace, $old_name);
rename($old_name, $new_name);
}
}
在这里,我们甚至不使用正则表达式或PHP字符串搜索功能来查找我们想要更改的文件。我们使用glob()
这基本上是对底层libc glob()
函数的直接调用,并且应该比使用当前使用的后置过滤器功能的DirectoryIterator
执行得更好,内存使用量更少。除非你正在进行更复杂的文件操作,否则DirectoryIterator
在这里可能有点过分。 glob()
会为您过滤您的文件名,这意味着您没有对DirectoryIterator
对象中包含的每个文件进行无用的正则表达式搜索,就像您当前所做的那样。
使用基本的str_replace()执行实际的文件路径名称更改。你现在还没有表明你是如何做到这一点的,但我想你会实现类似的东西,或者如果你想坚持使用正则表达式方法,可能只使用preg_replace()
而不是preg_match()
。