Знаете ли вы хорошие инструменты для удобного форматирования messy php code? Предпочтительно использовать сценарий для Aptana / Eclipse, но автономный инструмент тоже.
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; } } }
Ну вот мой очень простой и грубый сценарий:
#!/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, такой как Java.
См. Здесь для справки по установке.
Есть модуль груши, который форматирует ваш код. PHP Beautifier
Если вы используете среду разработки Zend, вы можете использовать функцию кода отступа (Ctrl + Shift + F).
Вот класс php code beautifier (PHP, конечно):
http://www.codeassembly.com/A-php-code-beautifier-that-works/
а также
онлайн-демонстрация:
Используйте NetBeans PHP и нажмите alt + shift + F.
Zend Development Environment теперь является плагином Eclipse, вы можете запустить его вместе с Aptana и просто использовать его функцию «Отступы».
Zend Studio
Я еще не обновился до плагина Eclipse, мне так нравится предыдущий ZDE. Хотя теперь, когда я начал использовать Eclipse для других языков, я почти готов совершить прыжок.
Как насчет этого:
http://universalindent.sourceforge.net/
Он сочетает в себе кучу форматировщиков и генерирует нужные вам сценарии, чтобы вы могли их выдать и заставить своих членов команды использовать их, прежде чем совершать в следующий раз … Хотя … formatters могут испортить ваш код и отобразить его непригодный для использования …
Наш PHP Formatter будет надежно форматировать ваш код. Он использует внешний интерфейс на основе компилятора для анализа кода, поэтому он не искажает код и не повреждает его. Следовательно, его отформатированный вывод всегда работает.
Самое простое решение – просто использовать интегрированную среду разработки, в которой встроена эта функция. Если вы собираетесь регулярно писать код на PHP, просто снимите $ 60 за PHPStorm. Вы не пожалеете об этом.
http://www.jetbrains.com/phpstorm/
Это позволяет вам форматировать свой код, как вам нравится, используя простой ярлык на уровне файла или каталога, и имеет еще две большие возможности.
phpformatter.com работает лучше всего
«Этот бесплатный онлайн-PHP Formatter разработан так, чтобы вы могли украсить весь свой PHP-скрипт с помощью стиля, который вы предпочитаете»
Это отличный вопрос. У меня есть приложение, которое читает 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 и дает вам живое обновление в файле при включении и выключении опций. Очень здорово. Затем, когда у вас есть свой стиль, у него есть возможность сохранить параметры командной строки и создать сценарий. Для некоторых параметров форматирования вам придется добавлять пути к perl, python и т. Д.
Если вы используете окна и хотите попробовать phpstylist с помощью UniversalIndent, просто добавьте каталог для php.exe в ваш env-путь. Я использую ampps, поэтому my установлен в c: \ ampps \ php.
Было нелегко найти хорошее твердое решение. Мне также интересно узнать, что делают другие люди для простого, возможного пакетного форматирования автоматически сгенерированных файлов php / html для проверки кода и архивирования.
У меня возникли проблемы с поиском достойного бесплатного форматирования для PHP, есть много онлайн-инструментов и инструментов командной строки, но они просто не работают по какой-то причине, результаты все еще полны плохих отступов с комбинациями вкладок и пробелов, и они никогда не получают брекеты так, как вы хотите их!
Я попробовал фрагмент выше, и это тоже не сработало для меня, отступы все еще заполнены пробелами и вкладками.
Таким образом, я тоже написал простой, он просто использует все регулярное выражение, не причудливую магию компилятора, поэтому возможно, что он может сломать вещи и по-прежнему очень бета-версии и тестируется на разных беспорядочных кодах. В настоящий момент интерфейс очень прост, но должен улучшиться в течение следующих нескольких дней.
Он жестко связан с соглашениями MediaWiki, но вы можете легко его изменить (я могу добавить варианты позже).