2013-05-07 1 views
1

디렉토리에 들어있는 내용에 대한 설명 사이에 ID가있는 디렉토리에 많은 이미지 파일이 있습니다. 드 테-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-10844.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입니다 내가 원하는 것을 얻을 것이 얼마나?

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

가 설명해

답변

2

$ 패턴을 사용합니다. 또한 preg_math는 문자열이 아니라 숫자를 반환합니다. 일치는 함수의 세 번째 매개 변수로 반환됩니다. 본문은 다음과 같이 표시되어야합니다.

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

$ matches는 일치하는 문자열 및 그룹과 일치하는 배열입니다.

+0

놀라운! 감사! –

3

는 그처럼하지 않을까요

^      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 개 그룹을 얻었다.

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

이 패턴 파일 이름을 확인하고 일치하는 그룹으로 ID를 얻을 수 있습니다 : 당신은 다음과 같이해야합니다 인덱스 1, 2, 3

+0

'\ d' 대신'[0-9]'를 사용하는 이유는 확실하지 않지만 확실히 틀리지는 않습니다. – sgroves

+0

실수가 하나 있습니다. 확장자는 .jpg가 아니고 \ .jpg이어야합니다. 왜냐하면 '.'은 메타 문자입니다. – Lukas

+0

그렇지 않으면 와일드 카드가됩니다. 감사합니다 – Niels

관련 문제