Script zur Entfernung von schliessenden PHP Tags
Nach wie vor gibt es viele Diskussionen ob das schliessende PHP-Tag am Ende einer PHP-Datei weggelassen werden sollte oder nicht. In vielen großen Projekten wird das Weglassen mittlerweile vorgeschrieben (Zend Framework, Symfony, Doctrine), in einigen muss es zwingend vorhanden sein (Lithium), aber in noch mehr Projekten ist es nicht festgelegt und wird mal weggelassen mal eingefügt, je nachdem welcher Entwickler die Datei erstellt bzw. als letztes geändert hat.
Besonders in Projekten mit gemischtem Vorgehen sollte eine einheitliche Lösung gefunden werden, und falls das die Löschung der End Tags bedeutet, dann nutze ich mein kleines Script hier um alle Dateien von schliessenden PHP Tags am Ende zu befreien:
<?php if ($argc == 2) { $path = $argv[1]; } else { $path = '.'; } // find all .php files recursively $files = array(); $Directory = new RecursiveDirectoryIterator($path); $Iterator = new RecursiveIteratorIterator($Directory); $Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH); foreach ($Regex as $r) { $files[] = $r[0]; } echo "Starting to process ".count($files)." files.\n"; foreach ($files as $file) { $content = file_get_contents($file); // if there are no end tags, don't do anything if (strpos($content, '?>') === false) { echo "skipping because there are no end tag: $file\n"; continue; } preg_match_all('/\?\>/', $content, $matches); if (count($matches[0]) > 1) { echo "skipping because of >1 end tags found, maybe not a php-only file: $file\n"; continue; } $newContent = rtrim($content); $newContent = preg_replace('/\?\>$/', '', $newContent, -1, $count); if ($count == 1) { $newContent = rtrim($newContent); $newContent .= "\n"; file_put_contents($file, $newContent); echo "fixed file: $file\n"; continue; } else { echo "skipping because the end tag is not at the end of the file: $file\n"; continue; } }
Ein Beispielaufruf steht in der README im GitHub Projekt, es gibt nur einen optionalen Parameter: Das Verzeichnis. Falls der Parameter nicht angegeben wird wird das aktuelle Verzeichnis genommen.
Das Script ist nicht perfekt und aktuell nicht für Projekte geeignet die mit Windows-Umbrüchen arbeiten, aber bisher hat es mir gute Dienste geleistet. Wer Lust hat kann es gern noch um die angesprochene Windows-Umbruch-Unterstützung erweitern oder anders verbessern, man kann sicher mit einem komplizierteren Regex arbeiten und sich die rtrim()s sparen. Würd mich sehr freuen.
Ich habe auch ein schönes kurzes Bash-Script gefunden, das aber nur auf Unix-Rechnern mit installiertem pcregrep, awk, wc und sed funktioniert, und genau das selbe tut.
Ähnliche Artikel: