Php-код formatter / beautifier и PHP-украшение в целом [закрыто]

знаете ли вы какие-либо хорошие инструменты для приятного форматирования беспорядочного php-кода? Предпочтительно скрипт для Aptana / Eclipse, но автономный инструмент тоже подойдет.

14 ответов


PHP код Beautifier является полезным бесплатным инструментом, который должен делать то, что вы после, хотя их страница скачать требуется создать учетную запись.

инструмент был отклонен в 3-х вариантах:

  • версия GUI, которая позволяет обрабатывать файл визуально.
  • версия командной строки, которая позволяет быть пакетной или интегрированной с другими инструментами (CVS, SubVersion, IDE ...).
  • как интегрированный инструмент PHPEdit.

в основном, он будет поворачиваться:

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;}}}

на

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;
        }
    }
}

Ну вот мой очень простой и грубый скрипт:

#!/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;
    }
}

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

^^^ даст вам правильный CTRL + SHIFT+F Eclipse / Aptana PHP форматирования, как Java.

посмотреть здесь для справки по установке.

eclipse php code formatter


есть модуль pear, который форматирует ваш код. PHP Beautifier


Если вы используете среду разработки Zend, вы можете использовать функцию кода отступа (Ctrl+Shift+F).


вот PHP-код beautifier (PHP, конечно) класс:
http://www.codeassembly.com/A-php-code-beautifier-that-works/

и

онлайн демо:

http://www.codeassembly.com/examples/beautifier.php


используйте NetBeans PHP и нажмите alt + shift + F.


среда разработки Zend теперь является плагином Eclipse, вы можете запустить его вместе с Aptana и просто использовать его функцию отступа.

Zend Studio

Я еще не обновился до плагина Eclipse, мне очень нравится предыдущий ZDE. Хотя теперь, когда я начал использовать Eclipse для других языков, я почти готов сделать прыжок.


Как насчет этого:

http://universalindent.sourceforge.net/

Он сочетает в себе кучу форматеров и будет генерировать сценарии, которые вам нужны, чтобы вы могли передать их и заставить членов вашей команды использовать их перед совершением в следующий раз... Хотя... formatters могут испортить ваш код и сделать его непригодным для использования...


наши PHP форматирование надежно отформатирует ваш код. Он использует интерфейс на основе компилятора для анализа кода, поэтому он не неправильно интерпретирует код и не повреждает его. Следовательно, его форматированный вывод всегда строительство.


самое простое решение-просто использовать IDE, в которой это встроено. Если вы собираетесь писать код на PHP на регулярной основе, просто бросьте $60 для PHPStorm. Ты не пожалеешь.

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

Он позволяет форматировать код, как вам нравится, используя простую комбинацию клавиш на уровне файла или каталога, и имеет множество других замечательных функций.


phpformatter.com работает

"Этот бесплатный онлайн-форматер PHP разработан так, чтобы вы могли украсить весь свой PHP-скрипт стилем, который вы предпочитаете"


Это хороший вопрос. У меня есть приложение, которое читает json и выводит php, html и css. Я запускаю программу и генерирую десятки (сотни?) файлов. Надеюсь, ответ здесь полезен.

Я начал свой проект с использованием heredocs, специальных файлов include, мета-символов и т. д., Но это быстро стало беспорядком. Я хотел автономное решение, которое не требовало фреймворка или ide. Поэтому я удалил весь heredoc и другой мусор и создал общий класс буферизации текста без забота о форматировании. Все это может быть одной строкой, мне все равно. Для html я делаю встроенный tidy (). Для php я использую phpstylist. phpstylist старше, но все еще хорошо работает для формата php.

для настройки параметров phpstylist я использовал UniversalIndent (Обновлено в январе 2012 года)в графическом интерфейсе windows.

UniversalStylist списки 24 (!) программы форматирования (c, php, ruby, html,...). Он специально знает варианты phpstylist и дает вам живое обновление на файл при включении и выключении параметров. Очень здорово. Затем, когда у вас есть свой стиль, он имеет возможность сохранить параметры командной строки и создает сценарий. Для некоторых параметров форматирования вам придется добавить пути к perl, python и т. д.

Если вы используете windows и хотите попробовать phpstylist с UniversalIndent, просто добавьте каталог для php.exe для вашего пути env. Я использую ampps поэтому мой установлен в c:\ampps\php - ...

Это было не очень легко найти хорошую решение. Мне также интересно услышать, что другие люди делают для простого, насколько это возможно, пакетного форматирования автоматически сгенерированных файлов php/html для просмотра кода и архивирования.


У меня было много проблем с поиском достойного бесплатного форматирования для PHP, а также есть много онлайн-инструментов и инструментов командной строки, но они просто не работают по какой-то причине, результаты все еще полны плохого отступа с комбинациями вкладок и пробелов, и они никогда не получают фигурные скобки так, как вы хотите!

Я попробовал фрагмент выше, и это тоже не сработало для меня, отступы все еще полны пробелов и вкладок.

Итак, я попробовал написание простого тоже, это просто использует все регулярное выражение, не причудливую магию компилятора, поэтому возможно, что он может сломать вещи, и все еще очень бета-версия и тестируется на различных беспорядочных кодах. Интерфейс очень простой на данный момент, но должен улучшиться в течение следующих нескольких дней.

Это hardwired для конвенций MediaWiki, но вы можете изменить его довольно легко (я могу добавить параметры позже).

https://www.organicdesign.co.nz/Special:CodeTidy