2013-05-07 47 views
1

我在目錄中有很多圖像文件,其ID之間有一些關於它包含的描述。正則表達式匹配由短劃線( - )分隔的數字並獲取子字符串

這是在該目錄中的文件的一個例子: DE-TE-MO-1084年1月19日moldura.JPG,CE-LD-NS-02-40-0453 senal.JPG,DP-BS -gu-01-43-1597-guante.JPG,am-ca-tw-04-30-2436 Tweter.JPG,am-ma-ac-02-26-0745 aceite.JPG,ca-cc-01-43 -1427-F.jpg

我要的是獲取圖像* (NNNN-NNNN)的ID,並重新命名與子字符串的文件。

* 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); 
    } 
} 

那麼,如何我$百通將得到我想要的東西?

回答

2

$模式必須是這樣的:

$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是匹配字符串和組的數組。

+0

令人驚歎!謝謝! – 2013-05-07 19:39:46

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

+0

不知道你爲什麼要用'[0-9]'而不是'\ d',但它肯定沒有錯誤 – sgroves 2013-05-07 19:24:34

+0

有一個錯誤:擴展名必須是'\ .jpg',而不是'.jpg',因爲'.'是一個元字符。 – Lukas 2013-05-07 19:27:12

+0

更正,否則它將是通配符。謝謝你 – Niels 2013-05-07 19:27:35

相關問題