Подтвердить что ты не робот

Php code formatter/beautifier и php beautification в целом

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

4b9b3361

Ответ 1

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

Ответ 2

Ну вот мой самый простой и грубый script:

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

Ответ 4

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

Ответ 5

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

Ответ 7

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

Ответ 8

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

Zend Studio

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

Ответ 9

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

http://universalindent.sourceforge.net/

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

phpformatter.com работает лучше всего

"Этот бесплатный онлайн-PHP Formatter разработан таким образом, что вы можете украсить весь свой PHP script с помощью стиля, который вы предпочитаете"

Ответ 13

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

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

Чтобы настроить параметры phpstylist, я использовал UniversalIndent (обновлено в январе 2012 г.) в windows gui.

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

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

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

Ответ 14

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

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

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

Он жестко связан с соглашениями MediaWiki, но вы можете легко его изменить (я могу добавить варианты позже).

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