正则表达式匹配由短划线( - )分隔的数字并获取子字符串

时间:2013-05-07 19:19:55

标签: php regex preg-match substring rename

我在一个目录中有很多图像文件,其ID在一些关于它包含内容的描述之间。

这是该目录中文件的示例: de-te-mo-01-19-1084 moldura.JPG,ce-ld-ns-02-40-0453 senal.JPG,dp-bs-gu-01-43-1597-guante.JPG,am -ca-tw-04-30-2436 Tweet.JPG,am-ma-ac-02-26-0745 aceite.JPG,ca-cc-01-43-1427-F.jpg

我想要的是获取图像的ID * (nn-nn-nnnn)并使用该子字符串重命名该文件。

* n作为数字。

上面列表的结果如下: 01-19-1084.JPG,02-40-0453.JPG,01-43-1597.JPG,04-30-2436.JPG,02- 26-0745.JPG,01-43-1427.jpg

这是我用来循环目录的代码:

 $dir = "images";

 // Open a known directory, and proceed to read its contents
 if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            if($sub_str = preg_match($patern, $file))
            {
                rename($dir.'/'.$file, $sub_str.'JPG');
            }
        }
        closedir($dh);
    }
 }

那么,我的 $ patern 将如何得到我想要的东西?

2 个答案:

答案 0 :(得分:3)

不会那样:

^.*([0-9]{2})-([0-9]{2})-([0-9]{4}).*\.jpg$

说明:

^                      Start of string
.*                     Match any characters by any number 0+
([0-9]{2})             2 Digits
-                      Just a - char
([0-9]{2})             2 Digits
-                      Just a - char
([0-9]{4})             4 Digits
-                      Just a - char
.*                     Any character
\.jpg                  Extension and escape wildcard
$                      End of string

现在你在()内有3个小组。你必须使用索引1,2和3。

答案 1 :(得分:2)

$ pattern必须是这样的:

$pattern = "/^.*(\d{2}-\d{2}-\d{4}).*\.jpg$/i"

此模式可以检查文件名并将id作为匹配组获取。 preg_math也返回数字,而不是字符串。匹配返回作为函数的第三个参数。身体必须看起来像这样:

if(preg_match($patern, $file, $matches))
{
      rename($dir.'/'.$file, $matches[1].'.JPG');
}

$ matches是具有匹配字符串和组的数组。