정규표현식 ....뭐가 잘못 되었는지

정규표현식 ....뭐가 잘못 되었는지

QA

정규표현식 ....뭐가 잘못 되었는지

본문

적용 전


$hz[a];
$hz[a][b];
$hz[$a][b];
$hz[$a][b][c];
$hz[$a][$b][c];

 

적용 후


$hz['a'];
$hz['a'][b];
$hz[$a]['b'];
$hz[$a]['b'][c];
$hz[$a][$b]['c'];

 

 

두번째와 네번째가 제대로 변경이 안 되는데,

뭐가 잘못 되었을까요?

 

 


<?php 
// 현재 폴더의 배열에 따옴표 붙이기
// 파일 소스가 다 날아갈 수 있으니 실행 전에 반드시 소스 백업 후 실행. 
// 테스트 후 사용할 것 
// 원본: sir.kr 회원 슈와이 님 
// 보완: Homzzang.com 신비
$dir = '.'; 
$scanned_dir = scandir($dir); 
foreach ($scanned_dir as $filename) { 
if (preg_match('/\.php$/', $filename)) {
  if ($filename == 'array_converter') continue; // 이 파일은 제외 (작동 X)
  if (filesize($filename) == 0) continue; 
  $handle = fopen($filename, 'r') or die('Unable to open file!'); 
  $contents = fread($handle, filesize($filename)); 
  fclose($handle); 
 
  // 1. $hz[a] => $hz['a'] 형태로 변환 
  $set_contents1 = preg_replace('/(\$\w+\[)(\w+)(\])/', "$1'$2'$3", $contents);
  
  // 2. $hz[a][b] => $hz['a']['b'] 형태로 변환 (작동 X)
  $set_contents2 = preg_replace('/(\$\w+\[)(\w+)(\]\[)(\w+)(\])/', "$1'$2'$3'$4'$5", $set_contents1); 
 
  // 3. $hz[$a][b] => $hz[$a]['b'] 형태로 변환 
  $set_contents3 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\])/', "$1$2$3'$4'$5", $set_contents2); 
  
  // 4. $hz[$a][b][c] => $hz[$a]['b']['c'] 형태로 변환 (작동 X)
  $set_contents4 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\]\[)(\w+)(\])/', "$1$2$3'$4'$5'$6'$7", $set_contents3);
  
  // 5. $hz[$a][$b][c] => $hz[$a][$b]['c'] 형태로 변환 
  $set_contents5 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\$\w+)(\]\[)(\w+)(\])/', "$1$2$3$4$5'$6'$7", $set_contents4);
 
  $handle = fopen($filename, 'w+') or die('Unable to open file!'); 
  if (fwrite($handle, $set_contents5) === FALSE) { 
    echo "Cannot write to file '$filename'"; 
    exit; 
  } 
  fclose($handle); 
} 
} 
echo '전환 완료'; 
?>

 

 

 

 

이 질문에 댓글 쓰기 :

답변 2

의도와는 다르게 1번 실행에서 아래처럼 두번째 것도 변환 되어버리기 때문에 2번 실행(21번행)에서는 패턴에 맞는 것을 찾을 수 없으니 변환 되지않습니다

$hz[a][b] --> $hz['a'][b];

 

이렇게 되어야겠습니다 (각 변환마다 패턴 끝에 [^\[] <--이것을 붙여야겠습니다

  // 1. $hz[a] => $hz['a'] 형태로 변환
  $set_contents1 = preg_replace('/(\$\w+\[)(\w+)(\])[^\[]/', "$1'$2'$3", $contents);

 

이것도 추가되면 좋겠군요

  // 6. $hz[$a][b][$c] => $hz[$a]['b'][$c] 형태로 변환
  $set_contents5 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\]\[)(\$\w+)(\])/', "$1$2$3'$4'$5$6$7", $set_contents5);

 

 

테스트 해보니 수정이 필요합니다
  $set_contents1 = preg_replace('/(\$\w+\[)(\w+)(\])([^\[])/', "$1'$2'$3$4", $contents);

각변환마다 마지막 부분을 위와 같이 해보세요

  // 5. $hz[$a][$b][c] => $hz[$a][$b]['c'] 형태로 변환
  $set_contents5 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\$\w+)(\]\[)(\w+)(\])([^\[])/', "$1$2$3$4$5'$6'$7$8", $set_contents4);

완성 코드

 


<?php 
// 기능: 현재 폴더의 배열에 따옴표 붙이기
// 주의: 파일 소스가 다 날아갈 수 있으니 실행 전에 반드시 소스 백업 및 테스트 후 사용 !! 
// 원본: sir.kr 회원 슈와이 님 (https://sir.kr/cm_free/1496376)
// 보완: Homzzang.com 신비 , sir.kr 회원 균이 님 (https://sir.kr/qa/287280)
$dir = '.'; 
$scanned_dir = scandir($dir); 
foreach ($scanned_dir as $filename) { 
if (preg_match('/\.php$/', $filename)) {
  if ($filename == 'index') continue; // 이 파일은 제외 (작동 X)
  if (filesize($filename) == 0) continue; 
  $handle = fopen($filename, 'r') or die('Unable to open file!'); 
  $contents = fread($handle, filesize($filename)); 
  fclose($handle); 
 
  // 1. $hz[a]=> $hz['a'] 형태로 변환 
  $set_contents1 = preg_replace('/(\$\w+\[)(\w+)(\])[^\[]/', "$1'$2'$3", $contents);
  
  // 2. $hz[a][b]=> $hz['a']['b'] 형태로 변환
  $set_contents2 = preg_replace('/(\$\w+\[)(\w+)(\]\[)(\w+)(\])[^\[]/', "$1'$2'$3'$4'$5", $set_contents1); 
 
  // 3. $hz[$a][b]=> $hz[$a]['b'] 형태로 변환 
  $set_contents3 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\])[^\[]/', "$1$2$3'$4'$5", $set_contents2); 
  
  // 4. $hz[$a][b][c]=> $hz[$a]['b']['c'] 형태로 변환
  $set_contents4 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\]\[)(\w+)(\])[^\[]/', "$1$2$3'$4'$5'$6'$7", $set_contents3);
  
  // 5. $hz[$a][$b][c]=> $hz[$a][$b]['c'] 형태로 변환 
  $set_contents5 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\$\w+)(\]\[)(\w+)(\])[^\[]/', "$1$2$3$4$5'$6'$7", $set_contents4);
  // 6. $hz[$a][b][$c]=> $hz[$a]['b'][$c] 형태로 변환
  $set_contents6 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\]\[)(\$\w+)(\])[^\[]/', "$1$2$3'$4'$5$6$7", $set_contents5);
 
  $handle = fopen($filename, 'w+') or die('Unable to open file!'); 
  if (fwrite($handle, $set_contents6) === FALSE) { 
    echo "Cannot write to file '$filename'"; 
    exit; 
  } 
  fclose($handle); 
} 
} 
echo '전환 완료'; 
?>

 

 

오토셋 (APM)툴을 PC에 설치 후,

/AC/index.php 파일 구조가 되게 위 소스를 넣으세요.

그런 다음 변환작업할 애들을 이 폴더 안에 집어넣습니다.

그런 다음, 브라우저에서 저 주소로 접속하면 변환됩니다.

(예) http://127.0.0.1/AC

 

 

 

PS.

혹시, 이 실행파일은 위 변환 코드의 영향을 안 받게 하려면 어떻게 해야 할까요?

답변을 작성하시기 전에 로그인 해주세요.
전체 253
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT