Facebook
Twitter
Google+
Kommentare
0
Willkommen bei "the web hates me". Mittlerweile hat unser Team ein tolles neues Monitoringtool für Agenturen gelauncht. Unter dem Namen koality.io haben wir einen Service geschaffen, der er Agenturen ermöglicht mit sehr geringen Kosten alle Ihre Webseiten zu überwachen.

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:

  1. Ein PHP-Script als Windows-Dienst starten
Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen