code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:Skript reparieren -> php_repair.php
md5:0b48a9a79c73277b09c1f8e486142f7f
sha1:f96c730eaeb6842ef9a89a7aeb769ee4a8930ef2
  1. <?php
  2. /*
  3. ** repariert PHP Skripte:
  4. ** entfernt BOMs
  5. ** entfernt Leerzeilen am Beginn
  6. ** entfernt Leerzeichen vor <? oder <?php
  7. ** ersetzt <? durch <?php
  8. */
  9.  
  10. # Konfiguration:
  11.  
  12. $config['DIR'] = '/tmp';   # In welchem Verzeichnis sollen die Dateien repariert werden?
  13. #$config['DIR'] = '.';     # aktuelles Verzeichnis
  14. #$config['DIR'] = __DIR__; # Verzeichnis dieses Skriptes
  15. #$config['DIR'] = $SERVER['DOCUMENT_ROOT'];
  16.  
  17. $config['IGNOREUPPERLOWER'] = false; # Für Linux-Benutzer...
  18. #$config['IGNOREUPPERLOWER'] = true; # Für Windows-Benutzer...
  19.  
  20. $config['FIND'] = '*.inc.php'; # * beliebiges Zeichen beliebig oft
  21.                           # ? beliebiges Zeichen genau einmal
  22.  
  23. $arExkludeList=array(
  24.     # Nach letztem Eintrag kein Komma!
  25.    'diese_nicht/*', # Unterverzeichnis ausgehend von $config['DIR'], kein führender "/"
  26.    '*.ex'    # Dateien mit Endung "ex"
  27. );
  28.  
  29. $habeBackup = false; # Setzen Sie dieses aus true, nachdem ein Backup gemacht wurde.
  30.  
  31. ## Ab hier ändern nur Programmierer, die wissen, was sie tun:
  32.  
  33. define ( 'DIR', rtrim($config['DIR']), '/' );
  34. define ( 'FIND', $config['FIND'] );
  35. define ( 'IGNOREUPPERLOWER', $config['IGNOREUPPERLOWER']);
  36.  
  37. if ( isset($SERVER['DOCUMENT_ROOT']) ) {
  38.     define ('NL', "<br>\n");
  39. } else {
  40.     define ('NL', "\n");
  41. }
  42.  
  43. $fileList=getFileList(DIR);
  44. $arExkludeListRegex=array();
  45.  
  46. foreach ($arExkludeList as $s) {
  47.    if ($s) {
  48.         $arExkludeListRegex[] = patternToRegex(DIR . '/' . $s, true, IGNOREUPPERLOWER);
  49.    }
  50. }
  51. unset($arExkludeList);
  52.  
  53. foreach ($fileList as $file) {
  54.     $isExcluded=false;
  55.     foreach ($arExkludeListRegex as $regex) {
  56.         if ( ! $isExcluded && preg_match($regex, $file)  ) {
  57.            $isExcluded=true;
  58.            break;
  59.         }
  60.     }
  61.  
  62.     if ($isExcluded) {
  63.         echo "Info: '$file' wurde ausgeschlossen.", NL;
  64.     } elseif (! is_readable($file)) {
  65.         echo "Warnung: Keine Leserechte an '$file'", NL;
  66.     } elseif (! is_writable($file)) {
  67.         echo "Warnung: Keine Schreibrechte an '$file'", NL;
  68.     } elseif ($habeBackup) {
  69.         echo "Info: Verarbeite '$file'";
  70.         repair($file);
  71.     } else {
  72.         echo "Info: würde '$file' verarbeiten, wenn das Anlegen eines Backups bestätigt wäre.", NL;
  73.     }
  74. }
  75.  
  76. echo "### Fertig! ###", NL;
  77.  
  78. #### Von diesem Skript verwendete Funktionen ####
  79. # sollten unverändert bleiben.
  80.  
  81. function patternToRegex($string, $allRow=false, $ignoreUpperLower=false) {
  82.     if ($ignoreUpperLower) {
  83.         $ignoreUpperLower='i';
  84.     } else {
  85.         $ignoreUpperLower='';
  86.     }
  87.  
  88.     $string=str_replace('/', '\\/', $string);
  89.  
  90.     $search  = array( '.' , '*' , '?');
  91.     $replacment = array( '\.', '.*', '.');
  92.  
  93.     if ($allRow) {
  94.         return '/^' . str_replace($search, $replacment,  $string) . '$/' . $ignoreUpperLower;
  95.     } else {
  96.         return '/' . str_replace($search, $replacment,  $string) . '/' . $ignoreUpperLower;
  97.     }
  98. }
  99.  
  100. function getFileList($dir) {
  101.     $list=array();
  102.     $regex = patternToRegex(FIND, false, IGNOREUPPERLOWER);
  103.     if ( is_dir($dir) && is_readable($dir) ) {
  104.         $d = dir($dir);
  105.         if ($d) {
  106.             while (false !== ($entry = $d->read())) {
  107.                 if ( '.' != $entry && '..' != $entry ) {
  108.                     $entry = $dir .'/'. $entry;
  109.                     if ( is_dir($entry) ) {
  110.                         $arT = getFileList($entry);
  111.                         foreach ($arT as $s) {
  112.                             $list[]=$s;
  113.                         }
  114.                     } elseif ( preg_match($regex, $entry) ) {
  115.                         $list[] = $entry;
  116.     }   }   }   }   }
  117.     return $list;
  118. }
  119.  
  120.  
  121. #### Arbeitende Funktionen ####
  122. # können für andere Verwendungen ersetzt werden
  123.  
  124. function repair($file) {
  125.     $newSkript = '';
  126.     $isFirstLine = true;
  127.  
  128.     $ar=file($file);
  129.  
  130.     foreach ($ar as $row) {
  131.         #$row = trim($row);
  132.        $row = rmBOM($row);                      #löscht alle bekannten BOM
  133.        if ( $isFirstLine ) {
  134.             $row = rmOnlySpaces($row);           #löscht alle Spaces in Zeilen, die nur solche
  135.                                                 #enthalten
  136.        }
  137.         if ( $row ) {
  138.             $row = rmSpacesBevorPhpTag($row);    #löscht alle spaces vor <?php
  139.                                                 #ersetzt <? und <?PHP durch <?php
  140.            $newSkript .= $row;
  141.             $isFirstLine = false;
  142.         }
  143.     }
  144.     file_put_contents($file, $newSkript);
  145.     echo " ... erledigt!", NL;
  146. }
  147.  
  148.  
  149. function rmBOM($str, $replacment = '') {
  150.  # source: https://en.wikipedia.org/wiki/Byte_order_mark
  151.  
  152.     $boms=array( # Liste möglicher BOMs
  153.        urldecode('%EF%BB%BF'),       #UTF-8
  154.        urldecode('%FE%FF'),          #UTF-16 (BE)
  155.        urldecode('%FF%FE'),          #UTF-16 (LE)
  156.        urldecode('%00%00%FE%FF'),    #UTF-32 (BE)
  157.        urldecode('%FF%FE%00%00'),    #UTF-32 (LE)
  158.        urldecode('%2B%2F%76%38'),    #UTF-7
  159.        urldecode('%2B%2F%76%39'),    #UTF-7
  160.        urldecode('%2B%2F%76%2B'),    #UTF-7rmOnlySpaces
  161.        urldecode('%2B%2F%76%2F'),    #UTF-7
  162.        urldecode('%2B%2F%76%38%2D'), #UTF-7
  163.        urldecode('%F7%64%4C'),       #UTF-1rmOnlySpaces
  164.        urldecode('%DD%73%66%73'),    #UTF-EeBCDIC
  165.        urldecode('%0E%FE%FF'),       #SCSU
  166.        urldecode('%FB%EE%28'),       #BOCU-1
  167.        urldecode('%84%31%95%33')     #GB-18030
  168.    );
  169.     return str_replace($boms, $replacment, $str);
  170. }
  171.  
  172. function rmSpacesBevorPhpTag($str, $replacment = '') {
  173.     $replacment .= '<?php';
  174.     return preg_replace('/^\s*<\?([pP][hH][pP]){0,1}/', $replacment, $str);
  175. }
  176.  
  177. function rmOnlySpaces($str, $replacment = 'repair($file)') {
  178.     return preg_replace('/^\s+$/', $replacment, $str);
  179. }