Jörg Reinholz: Korrigierte Version

Beitrag lesen

So, da haben sich auf Grund einer recht lockeren mittleren Maustaste (die zugleich Scrollrad ist) beim Einfügen ins Forum ein paar Fehler eingeschlichen, die dann auch nicht gleich offensichtlich wurden.

Verbesserte Version

<?php
## repariert PHP Skripte:
## entfernt BOMs
## entfernt Leerzeilen am Beginn
## entfernt Leerzeichen vor <? oder <?php
## ersetzt <? durch <?php

# Konfiguration:

$config['DIR'] = '/tmp';   # In welchem Verzeichnis sollen die Dateien repariert werden?
#$config['DIR'] = '.';     # aktuelles Verzeichnis
#$config['DIR'] = __DIR__; # Verzeichnis dieses Skriptes
#$config['DIR'] = $SERVER['DOCUMENT_ROOT'];

$config['IGNOREUPPERLOWER'] = false; # Für Linux-Benutzer...
#$config['IGNOREUPPERLOWER'] = true; # Für Windows-Benutzer...

# Diese Dateien werden gesucht und bearbeitet:
$config['FIND'] = '*.php'; # * beliebiges Zeichen beliebig oft
                           # ? beliebiges Zeichen genau einmal

$arExkludeList=array(
    # Diese Dateien aber nicht bearbeiten:
    # Nach letztem Eintrag kein Komma!
    'test/*', # Unterverzeichnis ausgehend von $config['DIR'], kein führender "/"
    '*.ex'    # Dateien mit Endung ".ex"
);

$habeBackup = false; # Setzen Sie dieses auf true, nachdem ein Backup gemacht wurde.

## Ab hier ändern nur Programmierer, die wissen, was sie tun:

define ( 'DIR', rtrim($config['DIR']), '/' );
define ( 'FIND', $config['FIND'] );
define ( 'IGNOREUPPERLOWER', $config['IGNOREUPPERLOWER']);

if ( isset($_SERVER['DOCUMENT_ROOT']) ) {
    define ('NL', "<br>\n");
} else {
    define ('NL', "\n");
}

$fileList=getFileList(DIR);
$arExkludeListRegex=array();

foreach ($arExkludeList as $s) {
   if ($s) {
        $arExkludeListRegex[] = patternToRegex(DIR . '/' . $s, true, IGNOREUPPERLOWER);
   }
}
unset($arExkludeList);

foreach ($fileList as $file) {
    $isExcluded=false;
    foreach ($arExkludeListRegex as $regex) {
        if ( ! $isExcluded && preg_match($regex, $file)  ) {
           $isExcluded=true;
           break;
        }
    }

    if ($isExcluded) {
        echo "Info: '$file' wurde ausgeschlossen.", NL;
    } elseif (! is_readable($file)) {
        echo "Warnung: Keine Leserechte an '$file'", NL;
    } elseif (! is_writable($file)) {
        echo "Warnung: Keine Schreibrechte an '$file'", NL;
    } elseif ($habeBackup) {
        echo "Info: Verarbeite '$file'";
        repair($file);
    } else {
        echo "Info: Würde '$file' verarbeiten, wenn das Anlegen eines Backups bestätigt wäre.", NL;
    }
}

echo "### Fertig! ###", NL;

#### Von diesem Skript verwendete Funktionen ####
# sollten unverändert bleiben.

function patternToRegex($string, $allRow=false, $ignoreUpperLower=false) {
    if ($ignoreUpperLower) {
        $ignoreUpperLower='i';
    } else {
        $ignoreUpperLower='';
    }

    $string=str_replace('/', '\\/', $string);

    $search  = array( '.' , '*' , '?');
    $replacment = array( '\.', '.*', '.');

    if ($allRow) {
        return '/^' . str_replace($search, $replacment,  $string) . '$/' . $ignoreUpperLower;
    } else {
        return '/' . str_replace($search, $replacment,  $string) . '/' . $ignoreUpperLower;
    }
}

function getFileList($dir) {
    $list=array();
    $regex = patternToRegex(FIND, false, IGNOREUPPERLOWER);
    if ( is_dir($dir) && is_readable($dir) ) {
        $d = dir($dir);
        if ($d) {
            while (false !== ($entry = $d->read())) {
                if ( '.' != $entry && '..' != $entry ) {
                    $entry = $dir .'/'. $entry;
                    if ( is_dir($entry) ) {
                        $arT = getFileList($entry);
                        foreach ($arT as $s) {
                            $list[]=$s;
                        }
                    } elseif ( preg_match($regex, $entry) ) {
                        $list[] = $entry;
    }   }   }   }   }
    return $list;
}


#### Arbeitende Funktionen ####
# können für andere Verwendungen ersetzt werden

function repair($file) {
    $newSkript = '';
    $isFirstLine = true;

    $ar=file($file);

    foreach ($ar as $row) {
        #$row = trim($row);
        $row = rmBOM($row);                      #löscht alle bekannten BOM
        if ( $isFirstLine ) {
            $row = rmOnlySpaces($row);           #löscht alle Spaces in Zeilen, die nur solche
                                                 #enthalten
        }
        if ( $row ) {
            $row = rmSpacesBevorPhpTag($row);    #löscht alle spaces vor <?php
                                                 #ersetzt <? und <?PHP durch <?php
            $newSkript .= $row;
            $isFirstLine = false;
        }
    }
    file_put_contents($file, $newSkript);
    echo " ... erledigt!", NL;
}


function rmBOM($str, $replacment = '') {
 # source: https://en.wikipedia.org/wiki/Byte_order_mark

    $boms=array(
        urldecode('%EF%BB%BF'),       #UTF-8
        urldecode('%FE%FF'),          #UTF-16 (BE)
        urldecode('%FF%FE'),          #UTF-16 (LE)
        urldecode('%00%00%FE%FF'),    #UTF-32 (BE)
        urldecode('%FF%FE%00%00'),    #UTF-32 (LE)
        urldecode('%2B%2F%76%38'),    #UTF-7
        urldecode('%2B%2F%76%39'),    #UTF-7
        urldecode('%2B%2F%76%2B'),    #UTF-7
        urldecode('%2B%2F%76%2F'),    #UTF-7
        urldecode('%2B%2F%76%38%2D'), #UTF-7
        urldecode('%F7%64%4C'),       #UTF-1
        urldecode('%DD%73%66%73'),    #UTF-EeBCDIC
        urldecode('%0E%FE%FF'),       #SCSU
        urldecode('%FB%EE%28'),       #BOCU-1
        urldecode('%84%31%95%33')     #GB-18030
    );
    return str_replace($boms, $replacment, $str);
}

function rmSpacesBevorPhpTag($str, $replacment = '') {
    $replacment .= '<?php';
    return preg_replace('/^\s*<\?([pP][hH][pP]){0,1}/', $replacment, $str);
}

function rmOnlySpaces($str, $replacment = '') {
    return preg_replace('/^\s+$/', $replacment, $str);
}