这个正则表达式PHP代码有什么问题?

时间:2015-11-11 17:30:02

标签: php regex

我有一个存储数千个图片文件的文件夹。 我想更改与条件匹配的每个文件的名称。 我们的想法是,如果文件名 _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里面尝试它,那就行得很好。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

您已经在preg_match()命令中切换了主题和模式。试试这个:

if (preg_match("/_10/", $filename)) {
    // more code
}

http://php.net/manual/en/function.preg-match.php

答案 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()