it-swarm.com.de

PHP-Code-Formatierer/-Beautifier und PHP-Verschönerung im Allgemeinen

Kennen Sie gute Werkzeuge, um unordentlichen PHP-Code zu formatieren? Vorzugsweise ein Skript für Aptana/Eclipse, aber auch ein Standalone-Tool.

32
deadprogrammer

PHP Code Beautifier ist ein nützliches kostenloses Tool, das tun soll, was Sie wollen, auch wenn die Downloadseite die Erstellung eines Kontos erfordert.

Das Tool wurde in 3 Versionen abgelehnt:

  • Eine GUI-Version, die die visuelle Verarbeitung von Dateien ermöglicht.
  • Eine Befehlszeilenversion, die gestapelt oder in andere Tools integriert werden kann (CVS, Subversion, IDE ...).
  • Als integriertes Werkzeug von PHPEdit.

Im Grunde wird es drehen:

if($code == BAD){$action = REWRITE;}else{$action = KEEP;}
for($i=0; $i<10;$i++){while($j>0){$j++;doCall($i+$j);if($k){$k/=10;}}}

in

if ($code == BAD) {
    $action = REWRITE;
} else {
    $action = KEEP;
}
for($i = 0; $i < 10;$i++) {
    while ($j > 0) {
        $j++;
        doCall($i + $j);
        if ($k) {
            $k /= 10;
        }
    }
}
11
ConroyP

Nun, hier ist mein grundlegendes und grobes Skript:

#!/usr/bin/php
<?php
class Token {
    public $type;
    public $contents;

    public function __construct($rawToken) {
        if (is_array($rawToken)) {
            $this->type = $rawToken[0];
            $this->contents = $rawToken[1];
        } else {
            $this->type = -1;
            $this->contents = $rawToken;
        }
    }
}

$file = $argv[1];
$code = file_get_contents($file);

$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
    $tokens[] = new Token($rawToken);
}

function skipWhitespace(&$tokens, &$i) {
    global $lineNo;
    $i++;
    $token = $tokens[$i];
    while ($token->type == T_WHITESPACE) {
        $lineNo += substr($token->contents, "\n");
        $i++;
        $token = $tokens[$i];
    }
}

function nextToken(&$j) {
    global $tokens, $i;
    $j = $i;
    do {
        $j++;
        $token = $tokens[$j];
    } while ($token->type == T_WHITESPACE);
    return $token;
}

$OPERATORS = array('=', '.', '+', '-', '*', '/', '%', '||', '&&', '+=', '-=', '*=', '/=', '.=', '%=', '==', '!=', '<=', '>=', '<', '>', '===', '!==');

$IMPORT_STATEMENTS = array(T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE);

$CONTROL_STRUCTURES = array(T_IF, T_ELSEIF, T_FOREACH, T_FOR, T_WHILE, T_SWITCH, T_ELSE);
$WHITESPACE_BEFORE = array('?', '{', '=>');
$WHITESPACE_AFTER = array(',', '?', '=>');

foreach ($OPERATORS as $op) {
    $WHITESPACE_BEFORE[] = $op;
    $WHITESPACE_AFTER[] = $op;
}

$matchingTernary = false;

// First pass - filter out unwanted tokens
$filteredTokens = array();
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->contents == '?') {
        $matchingTernary = true;
    }
    if (in_array($token->type, $IMPORT_STATEMENTS) && nextToken($j)->contents == '(') {
        $filteredTokens[] = $token;
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            $filteredTokens[] = new Token(array(T_WHITESPACE, ' '));
        }
        $i = $j;
        do {
            $i++;
            $token = $tokens[$i];
            if ($token->contents != ')') {
                $filteredTokens[] = $token;
            }
        } while ($token->contents != ')');
    } elseif ($token->type == T_ELSE && nextToken($j)->type == T_IF) {
        $i = $j;
        $filteredTokens[] = new Token(array(T_ELSEIF, 'elseif'));
    } elseif ($token->contents == ':') {
        if ($matchingTernary) {
            $matchingTernary = false;
        } elseif ($tokens[$i - 1]->type == T_WHITESPACE) {
            array_pop($filteredTokens); // Remove whitespace before
        }
        $filteredTokens[] = $token;
    } else {
        $filteredTokens[] = $token;
    }
}
$tokens = $filteredTokens;

function isAssocArrayVariable($offset = 0) {
    global $tokens, $i;
    $j = $i + $offset;
    return $tokens[$j]->type == T_VARIABLE &&
        $tokens[$j + 1]->contents == '[' &&
        $tokens[$j + 2]->type == T_STRING &&
        preg_match('/[a-z_]+/', $tokens[$j + 2]->contents) &&
        $tokens[$j + 3]->contents == ']';
}

// Second pass - add whitespace
$matchingTernary = false;
$doubleQuote = false;
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->contents == '?') {
        $matchingTernary = true;
    }
    if ($token->contents == '"' && isAssocArrayVariable(1) && $tokens[$i + 5]->contents == '"') {
        /*
         * Handle case where the only thing quoted is the assoc array variable.
         * Eg. "$value[key]"
         */
        $quote = $tokens[$i++]->contents;
        $var = $tokens[$i++]->contents;
        $openSquareBracket = $tokens[$i++]->contents;
        $str = $tokens[$i++]->contents;
        $closeSquareBracket = $tokens[$i++]->contents;
        $quote = $tokens[$i]->contents;        
        echo $var . "['" . $str . "']";
        $doubleQuote = false;
        continue;
    }
    if ($token->contents == '"') {
        $doubleQuote = !$doubleQuote;
    }
    if ($doubleQuote && $token->contents == '"' && isAssocArrayVariable(1)) {
        // don't echo "
    } elseif ($doubleQuote && isAssocArrayVariable()) {
        if ($tokens[$i - 1]->contents != '"') {
            echo '" . ';
        }
        $var = $token->contents;
        $openSquareBracket = $tokens[++$i]->contents;
        $str = $tokens[++$i]->contents;
        $closeSquareBracket = $tokens[++$i]->contents;
        echo $var . "['" . $str . "']";
        if ($tokens[$i + 1]->contents != '"') {
            echo ' . "';
        } else {
            $i++; // process "
            $doubleQuote = false;
        }
    } elseif ($token->type == T_STRING && $tokens[$i - 1]->contents == '[' && $tokens[$i + 1]->contents == ']') {
        if (preg_match('/[a-z_]+/', $token->contents)) {
            echo "'" . $token->contents . "'";
        } else {
            echo $token->contents;
        }
    } elseif ($token->type == T_ENCAPSED_AND_WHITESPACE || $token->type == T_STRING) {
        echo $token->contents;
    } elseif ($token->contents == '-' && in_array($tokens[$i + 1]->type, array(T_LNUMBER, T_DNUMBER))) {
        echo '-';
    } elseif (in_array($token->type, $CONTROL_STRUCTURES)) {
        echo $token->contents;
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';
        }
    } elseif ($token->contents == '}' && in_array($tokens[$i + 1]->type, $CONTROL_STRUCTURES)) {
        echo '} ';
    } elseif ($token->contents == '=' && $tokens[$i + 1]->contents == '&') {
        if ($tokens[$i - 1]->type != T_WHITESPACE) {
            echo ' ';
        }
        $i++; // match &
        echo '=&';
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';          
        }
    } elseif ($token->contents == ':' && $matchingTernary) {
        $matchingTernary = false;
        if ($tokens[$i - 1]->type != T_WHITESPACE) {
            echo ' ';
        }
        echo ':';
        if ($tokens[$i + 1]->type != T_WHITESPACE) {
            echo ' ';
        }
    } elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE &&
        in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
        echo ' ' . $token->contents . ' ';
    } elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE) {
        echo ' ' . $token->contents;
    } elseif (in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
        echo $token->contents . ' ';
    } else {
        echo $token->contents;
    }
}
39
grom

http://en.sourceforge.jp/projects/pdt-tools/

^^^ gibt Ihnen ein richtiges STRG + UMSCHALT + F Eclipse/Aptana PHP Formatierungsprogramm wie Java.

Siehe hier für Installationshilfe.

Eclipse php code formatter

15
Chris

Es gibt ein Birnenmodul, das Ihren Code formatiert. PHP Beautifier

6
projecktzero

Wenn Sie die Zend-Entwicklungsumgebung verwenden, können Sie die Funktion Code einrücken (Strg + Umschalttaste + F) verwenden.

5
Ian P
4
micahwittman

Verwenden Sie NetBeans PHP und drücken Sie Alt + Umschalt + F.

4

Die Zend-Entwicklungsumgebung ist jetzt ein Eclipse-Plugin. Sie können es möglicherweise neben Aptana ausführen und einfach die Indent-Code-Funktion verwenden. 

Zend Studio

Ich habe noch nicht selbst auf das Eclipse-Plugin upgegradet, ich liebe die vorherige ZDE so sehr. Obwohl ich Eclipse jetzt für andere Sprachen verwendet habe, bin ich fast bereit, den Sprung zu machen.

3
Adam

Die einfachste Lösung besteht darin, einfach ein IDE zu verwenden, das über diese Funktion verfügt. Wenn Sie regelmäßig in PHP Code schreiben, lassen Sie die $ 60 einfach fallen PHPStorm. Du wirst es nicht bereuen.

http://www.jetbrains.com/phpstorm/

Sie können Ihren Code mit einer einfachen Tastenkombination auf Datei- oder Verzeichnisebene beliebig formatieren und verfügt über eine Vielzahl weiterer Funktionen.

2
Aaron

Was ist mit diesem hier:

http://universalindent.sourceforge.net/

Es kombiniert eine Reihe von Formattern und generiert die erforderlichen Skripts, sodass Sie sie weitergeben können und die Teammitglieder dazu bringen, sie zu verwenden, bevor Sie sich das nächste Mal entscheiden unbrauchbar... 

2
SeanJA

phpformatter.com funktioniert am besten

"Dieser kostenlose Online-Formater PHP ist so konzipiert, dass Sie Ihr PHP -Skript mit dem von Ihnen bevorzugten Stil verschönern können."

1
vaichidrewar

Unser PHP Formatter formatiert Ihren Code zuverlässig. Es verwendet ein Compiler-basiertes Frontend, um den Code zu analysieren, sodass der Code nicht falsch interpretiert und beschädigt wird. Folglich funktioniert seine formatierte Ausgabe always .

1
Ira Baxter

Dies ist eine ausgezeichnete Frage. Ich habe eine Anwendung, die Json liest und PHP, HTML und CSS ausgibt. Ich starte ein Programm und generiere Dutzende (Hunderte?) Von Dateien. Ich hoffe die Antwort hier ist nützlich.

Ich habe mein Projekt mit Heredocs, speziellen Include-Dateien, Meta-Zeichen usw. gestartet, aber das wurde schnell zum Chaos. Ich wollte eine Stand-Alone-Lösung, die weder Rahmen noch Ideen erfordert. Also entfernte ich den gesamten Heredoc und den anderen Müll und erstellte eine generische Textpufferklasse, ohne sich um die Formatierung zu kümmern. Es kann alles eine Linie für alles sein, was mich interessiert. Für HTML habe ich tidy () eingebaut. Für PHP verwende ich phpstylist . phpstylist ist älter, funktioniert aber immer noch gut für das php-Format.

Um die phpstylist-Optionen einzurichten, habe ich UniversalIndent (aktualisiert Jan 2012) in Windows gui verwendet. 

UniversalStylist listet 24 (!) Formatierungsprogramme auf (c, php, Ruby, html, ...). Es kennt insbesondere die Optionen für phpstylist und bietet eine Live-Aktualisierung einer Datei, wenn Sie die Optionen ein- und ausschalten. Sehr groß. Wenn Sie dann Ihren Stil haben, können Sie die Befehlszeilenoptionen speichern und ein Skript erstellen. Für einige Formatierungsoptionen müssen Sie Pfade zu Perl, Python usw. hinzufügen.

Wenn Sie Windows verwenden und phpstylist mit UniversalIndent ausprobieren möchten, fügen Sie einfach das Verzeichnis für php.exe zu Ihrem env-Pfad hinzu. Ich benutze ampps so ist meins auf c:\ampps\php gesetzt.

Es war nicht leicht, eine gute feste Lösung zu finden. Ich bin auch daran interessiert, was andere Leute für eine möglichst einfache Stapelformatierung automatisch generierter PHP-/HTML-Dateien für die Überprüfung und Archivierung von Code tun.

0
user1501974