정규표현식 ....뭐가 잘못 되었는지
관련링크
본문
적용 전
$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);
완성 코드
<?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 파일 구조가 되게 위 소스를 넣으세요.
그런 다음 변환작업할 애들을 이 폴더 안에 집어넣습니다.
그런 다음, 브라우저에서 저 주소로 접속하면 변환됩니다.
PS.
혹시, 이 실행파일은 위 변환 코드의 영향을 안 받게 하려면 어떻게 해야 할까요?
!-->
답변을 작성하시기 전에 로그인 해주세요.