테스트 사이트 - 개발 중인 베타 버전입니다

정규표현식 ....뭐가 잘못 되었는지 채택완료

sinbi 6년 전 조회 2,477

적용 전

</p>

<p>$hz[a];

$hz[a][b];

$hz[$a][b];

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

$hz[$a][$b][c];</p>

<p>

 

적용 후

</p>

<p>$hz['a'];

$hz['a'][b];

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

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

$hz[$a][$b]['c'];</p>

<p>

 

 

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

뭐가 잘못 되었을까요?

 

 

</p>

<p><?php 

// 현재 폴더의 배열에 따옴표 붙이기

// 파일 소스가 다 날아갈 수 있으니 실행 전에 반드시 소스 백업 후 실행. 

// 테스트 후 사용할 것 

// 원본: sir.kr 회원 슈와이 님 

// 보완: Homzzang.com 신비</p>

<p>$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); </p>

<p> </p>

<p>  // 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); </p>

<p> </p>

<p>  // 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);</p>

<p> </p>

<p>  $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 '전환 완료'; 

?></p>

<p>

 

 

 

 

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
6년 전

의도와는 다르게 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);

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

s
sinbi
6년 전
사랑합니다. 균이 님.
테스트 해본 후, 피드백 답변 달아놓겠습니다.
정말 감사합니다.
균이
6년 전
테스트 해보니 수정이 필요합니다
$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);
s
sinbi
6년 전
방금 테스트해보니 아주 잘 작동되네요. 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

s
sinbi Expert
6년 전

완성 코드

 

</p>

<p><?php 

// 기능: 현재 폴더의 배열에 따옴표 붙이기

// 주의: 파일 소스가 다 날아갈 수 있으니 실행 전에 반드시 소스 백업 및 테스트 후 사용 !! 

// 원본: sir.kr 회원 슈와이 님 (<a href="https://sir.kr/cm_free/1496376)" target="_blank" rel="noopener noreferrer">https://sir.kr/cm_free/1496376)</a>

// 보완: Homzzang.com 신비 , sir.kr 회원 균이 님 (<a href="https://sir.kr/qa/287280)" target="_blank" rel="noopener noreferrer">https://sir.kr/qa/287280)</a></p>

<p>$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);</p>

<p>  // 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 '전환 완료'; 

?></p>

<p>

 

 

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

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

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

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

(예) http://127.0.0.1/AC

 

 

 

PS.

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

균이
6년 전
이 화일명을 index.php라고 했으면 10번행을 수정하세요

if ($filename == 'index.php') continue; // 이 파일은 제외 (작동 X)
s
sinbi
6년 전
아,,,확장자를 붙여야 되는 거군요.
저는 또 앞에 확장자 떼는 코드인 줄 알고......^^;;;

고민 해결 되서 기분 좋네요. 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인