이런 프로그램 있으면 대박일 듯.. > 자유게시판

자유게시판

이런 프로그램 있으면 대박일 듯.. 정보

이런 프로그램 있으면 대박일 듯..

본문

폴더 읽어들여, 그 안의 있는 파일의 코드를 

 

지정한 PHP 버전 문법에 맞게 자동변환되는 거....

 

 

 

에디드플러스에 이 기능 들어가면 좋을텐뎅..ㅎ

요며칠 PHP7.2 갖고 놀면서 떠오른 생각이네요.

추천
2

댓글 23개

// 현재 폴더내의 php 파일중에서 $row[a] => $row['a'] 형태로 변환하는건데
// 테스트용으로만 쓰세요.
$dir = '.';
$scanned_dir = scandir($dir);
foreach ($scanned_dir as $filename) {
    if (preg_match('/\.php$/', $filename)) {
        if (filesize($filename) == 0) continue;
        $handle = fopen($filename, 'r') or die('Unable to open file!');
        $contents = fread($handle, filesize($filename));
        fclose($handle);
        $set_contents = preg_replace('/(\$\w+\[)(\w+)(\])/', "$1'$2'$3", $contents);
        $handle = fopen($filename, 'w+') or die('Unable to open file!');
        if (fwrite($handle, $set_contents) === FALSE) {
            echo "Cannot write to file '$filename'";
            exit;
        }
        fclose($handle);
    }
}
헐......슈와이님 대단하세요.
걍...넋두리 한 건데.....코드를.  떡하니...
감사히 잘 쓰겠습니다.
슈와이 님, 테스트해보니 아주 잘 작동하네요.
좋은 소스 공유 감사합니다.

근데, 써보다 욕심난 게...
혹시,
서브폴더까지 검색해서
아래 형식들도 한번에 바꾸는 게 가능할까요?^^;
정규표현식 까막눈이다보니... ^^;;;

기왕 욕심 낸 거.........걍 닥 적어놓을테니, 껄끄러운 건 걍 사뿐히 패스해주세용.^^

변수명[$배열키]['문자열']  (예) $list[$i][mb_id]  또는 $list[$k][mb_id]
변수명[$배열키][$배열키]['문자열']  (예) $list[$i][$k][mb_id]
변수명['문자열']['문자열']  (예) $list[aaa][bbbb]

<?  ---> <?php
<?php= ---> <?php echo공백
<?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; // 이 파일은 제외
  if (filesize($filename) == 0) continue;
  $handle = fopen($filename, 'r') or die('Unable to open file!');
  $contents = fread($handle, filesize($filename));
  fclose($handle);

  // 1. 현재 폴더 php 파일에서 $row['a'] => $row['a'] 형태로 변환
  $set_contents1 = preg_replace('/(\$\w+\[)(\w+)(\])/', "$1'$2'$3", $contents);

  // 2. 현재 폴더 php 파일에서 $row[$a]['b'] => $row[$a]['b'] 형태로 변환
  $set_contents2 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\w+)(\])/', "$1$2$3'$4'$5", $set_contents1);

  // 3. 현재 폴더 php 파일에서 $row['a']['b'] => $row['a']['b'] 형태로 변환
  $set_contents3 = preg_replace('/(\$\w+\[)(\w+)(\]\[)(\w+)(\])/', "$1'$2'$3'$4'$5", $set_contents2);
 
  // 4. 현재 폴더 php 파일에서 $row[$a][$b][c] => $row[$a][$b]['c'] 형태로 변환
  $set_contents4 = preg_replace('/(\$\w+\[)(\$\w+)(\]\[)(\$\w+)(\]\[)(\w+)(\])/', "$1$2$3$4$5'$'6$7", $set_contents3);

  // 5. 현재 폴더 php 파일에서 $row[$a][b][c] => $row[$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_contents3) === FALSE) {
echo "Cannot write to file '$filename'";
exit;
  }
  fclose($handle);
}
}
echo '전환 완료';
?>


https://sir.kr/qa/287280
/**
* 하위폴더의 php 파일을 검색해서 변환
* $변수명[문자열]  => $변수명['문자열']
* <?  =>  <?php
* <?= => <?php echo
* 변형된 파일명 출력
* 백업후 테스트용으로 쓰세요
*/

// read all files of subdirectories
function scan_dir($pattern, $flags = 0) {
    $files = glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
        $files = array_merge($files, scan_dir($dir.'/'.basename($pattern), $flags));   
    return $files;
}

function add_single_quote($match) {
    return preg_replace("/(\[)([^$\d']\w*)(\])/", "$1'$2'$3", $match[0]);
}

$scanned_dir = scan_dir('*.php');
$converted_files = array();

foreach ($scanned_dir as $filename) { 
    if (filesize($filename) == 0 || basename(__FILE__) == $filename) continue;
    // read
    $handle = fopen($filename, 'r') or die('Unable to open file!');
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    // convert
    $set_contents = preg_replace_callback('/(?<=[\n= ])\$\S+\]/', 'add_single_quote', $contents);
    $set_contents = preg_replace(array('/<\?(?!php)/', '/<\?php=/'), array('<?php', '<?php echo '), $set_contents);
    if (strcmp($contents, $set_contents) == 0) continue;
    // write
    $converted_files[] = $filename; 
    $handle = fopen($filename, 'w+') or die('Unable to open file!');
    if (fwrite($handle, $set_contents) === FALSE) {
        echo "Cannot write to file '$filename'";
        exit;
    }
    fclose($handle);
}
// print
$cnt = count($converted_files);
echo '#converted files ', $cnt, '개<br>';
if ($cnt)
    echo implode('<br>', $converted_files);
?>
엄청난 코드를 선사해 주셨네요. ^^
감사합니다.
덕분에 며칠 전 말아먹은 홈페이지를 되살릴 수 있는 희망이 보이네요.
방금 테스트해봤는데,,,,입이 떡 벌어지네요.ㅎㅎㅎ
환상적입니다.
저번에 질게에서 자주 슈와이 님 정규표현식 답변을 보고 잠깐 공부한 적 있었는데.
돌아서니까 다 잊어버리게 되더라구요. 자주 쓰는 코드가 아니다보니..^^;;
도대체 이런 어려운 코드를 어케 다 기억하고 계시는지 정말 놀라울 따름입니다. ㅎ

덕분에 홈피 복구 작업할 때 많이 편해졌습니다. 정말 감사합니다.
따옴표 붙이는 작업이 굉장히 시간 잡아먹었는데.....
방금 확인해 보니,
배열이 낱개로 있을 땐 잘 되는데,
문맥상에 있을 땐 잘 안 되는 것 같습니다.

예를 들어, 아래 구문 같은 경우

바뀜
$config['cf_write_pages'];

안 바뀜
$write_pages = get_paging($config[cf_write_pages], $page, $total_page, $page_url);


※ (예) 배추베이직 list.skin.php 파일



<?php
// 바뀌는 애들
$hz[0];
$hz[a];
$hz[a_b];
$hz[a_b_c];
$hz[a][b];
$hz[$a][b];
$hz[$a][b][c];
$hz[$a][$b][c];
$hz[$a][b][$c];
$hz_k[a_b];
$hz_k[a_b_c];
$g4[time_ymd] ;
$g4[path] ;
$g4[admin_path] ;
$member[mb_id] ;
$member[mb_referer] ;
$row[mb_id] ;
$mb[mb_id] ;
$row[mb_leave_date] ;
$row[mb_intercept_date] ;
$row[ad_grade] ;
$row[cnt] ;
$row2[cnt] ;
$list[$i][cnt] ;
$config[cf_login_point] ;
$config_abc[cf_login_point] ;
$config_abc_efg[cf_login_point] ;
$config['cf_write_pages'];


// 안 바뀌는 애들
$write_pages = get_paging($config[cf_write_pages], $page, $total_page, $page_url);
if ($mw_basic[cf_reward]) $colspan+=3;
if ($mw_basic[cf_contents_shop]) $colspan++;
if ($mw_basic[cf_type] == "thumb") $colspan++;
if ($mw_basic[cf_type] == "gall") $colspan = $board['bo_gallery_cols'];
else if ($mw_basic[cf_attribute] == "qna") $colspan += 2;
if ($mw_basic[cf_bomb_level] && $list_count) {

?>
<? if(1 == 1) echo 1 ;?>
<?= "슈와이 님 감사합니다. " ;?>
테스트 해보니까 앞서 언급한 애들은 잘 되는데. 아래 것들이 안 되네요.
그래도, 상당히 많이 진전된 것 같아요.ㅎ



@unlink("$g4[path]/data/guploader/$row[bf_file]");


<?php if ($mw_basic['cf_type'] != "gall" && !$mw_basic[cf_social_commerce] && !$mw_basic[cf_talent_market]) { ?>


<?php if (!$mw_basic[cf_post_num]) ~~~ 이런 구조
<?php if (!$mw_basic[cf_post_name] ~~ 이런 구조


elseif (!$list[$i][wr_contents_price])


$thumb_width = "width='$mw_basic[cf_thumb_width]'"; -- 이런 구조

$style .= " style='font-family:{$list[$i][wr_subject_font]}; ";

$style .= " color:{$list[$i][wr_subject_color]}";

$list[$i]['subject'] = "<span{$style}>{$list[$i][subject]}</span></a>";

echo "<span class=mw_basic_list_num>{$list[$i]['num']}</span>";


....그외도 좀 많은데, 다 적기엔..^^;;
예시 배열 변환은 잘 되는데,
컨버터기에서 \ 역슬래시 기호를 제거해 스타일을 못 불러오는 경우가 생기네요.

예를 들어,
if (is_g5()) add_stylesheet("<link rel=\"stylesheet\" href=\"{$board_skin_path}/g5.css\"/>");

위 소스에서 큰따옴표 안에서 다시 큰따옴표를 사용하기 위한 역슬래시.....

변환도 중요하지만, 다른 요소엔 절대 영향이 안 가야 안심하고 돌릴 수 있을 듯 합니다. ^^;

PS.
컨버터 기 말고, 기존 소스 좀 수정해서 기존에 안 되던 배열 수정할 순 없을까요?
이게 서브폴더까지 한번에 바꿀 수 있어 좋더라구요.
write.skin.php 파일 소스 넣어서 점검하니까, 크롬이 이런 메세지를...ㅎ


페이지가 작동하지 않습니다. Chrome이 이 페이지에서 비정상적인 코드를 감지했으며 개인정보(예: 비밀번호, 전화번호, 신용카드) 보호를 위해 차단했습니다.
사이트의 홈페이지를 방문해 보세요.
ERR_BLOCKED_BY_XSS_AUDITOR
php_convert.php는 안되는 부분을 확인하는 용도로 만든겁니다.
안되는 부분을 올려 주시면 확인해 보도록 하겠습니다.

*다른 요소엔 절대 영향이 안 가야 안심하고 돌릴 수 있을 듯 합니다.*
테스트한 데이터에 대해서만 통과되었기때문에 다른 요소에 영향을 안 미친다고
단정지을수 없습니다.

다른 요소에 영향을 미쳤을때 되돌릴수 있는 롤백 기능이 추가 되어야 할거 같습니다.
낱개 줄로 테스트해보니 대충 잘 되는 것 같아요. ^^
근데, 지금 버그 잡는 작업 중인데, 이런 기능도 있으면 좋을 것 같아 제안해 봅니다.

예를 들어,
배열이 작은따옴표 사이에 단독으로 들어가 있거나,
또는 큰 따옴표 사이에 문자열과 섞어 들어가 있는 경우,
배열 앞뒤를 중괄호로 묶는 기능......

PHP 7.2.10 사용 중인데, 위처럼 괄호가 안묶은 건 죄다 에러를 뿜어내네요.
찾아서 일일이 수정해주고 있는데......보통 중노동이 아니네요.ㅎ

예를 들면 이런건가요?
$sql = "select a from $table[write] where {$where[a]} ";

$sql = "select a from {$table['write']} where {$where['a']} ";
예. 그거용. 근데, 이것도 주변에 여러 경우의 수가 있어서...ㅎ
해도해도 끝이 없네용.ㅋ
전체 195,054 |RSS
자유게시판 내용 검색

회원로그인

진행중 포인트경매

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