Korrigierte Version
bearbeitet von Jörg ReinholzSo, da haben sich auf Grund einer recht lockeren mittleren Maustaste hier beim Einfügen ins Forum ein paar Fehler eingeschlichen, die dann auch nicht gleich offensichtlich wurden.
Verbesserte Version
~~~php
<?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 = true; # Setzen Sie dieses aus 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);
}
~~~