Знаете ли вы какие-нибудь хорошие инструменты для красивого форматирования беспорядочного php-кода? Желательно скрипт для Aptana/Eclipse, но подойдет и отдельный инструмент.
Средство форматирования/улучшения кода PHP и благоустройство php в целом
Ответы (14)
PHP Code Beautifier – полезный бесплатный инструмент, который должен делать то, что вам нужно, хотя его < href="http://www.waterproof.fr/products/phpCodeBeautifier/download.php" rel="noreferrer">страница загрузки требует создания учетной записи.
Инструмент был отклонен в 3 версиях:
- Версия с графическим интерфейсом, позволяющая визуально обрабатывать файл.
- Версия для командной строки, которую можно объединять или объединять с другими инструментами (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;
}
}
}
PHP Code Beautifier
не работает
- person HDJEMAI; 21.04.2017
Ну вот мой очень простой и грубый сценарий:
#!/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.
См. здесь помощь по установке.
Есть грушевый модуль, который форматирует ваш код. Украшение PHP
Если вы используете Zend Development Environment, вы можете использовать функцию отступа кода (Ctrl+Shift+F).
Используйте NetBeans PHP и нажмите клавиши ALT+SHIFT+F.
Вот класс для улучшения кода php (разумеется, PHP):
http://www.codeassembly.com/A-php-code-beautifier-that-works/
и
онлайн-демонстрация:
http://www.codeassembly.com/examples/beautifier.php
Zend Development Environment теперь является подключаемым модулем Eclipse, вы можете запустить его вместе с Aptana и просто использовать его функцию Indent Code.
Я еще не обновился до плагина Eclipse, мне очень нравится предыдущий ZDE. Хотя теперь, когда я начал фактически использовать Eclipse для других языков, я почти готов сделать скачок.
Что насчет этого:
http://universalindent.sourceforge.net/
Он объединяет множество средств форматирования и генерирует сценарии, которые вам нужны, чтобы вы могли передать их и заставить членов вашей команды использовать их перед фиксацией в следующий раз... Хотя... средства форматирования могут испортить ваш код и отобразить его. непригодный...
Самое простое решение — просто использовать встроенную среду IDE. Если вы собираетесь писать код на PHP на регулярной основе, просто откажитесь от 60 долларов за PHPStorm. Вы не пожалеете об этом.
http://www.jetbrains.com/phpstorm/
Он позволяет вам форматировать ваш код так, как вам нравится, используя простое сочетание клавиш на уровне файла или каталога, и имеет множество других замечательных функций.
Наш модуль форматирования PHP надежно отформатирует ваш код. Он использует внешний интерфейс на основе компилятора для анализа кода, поэтому он не интерпретирует код неправильно и не повреждает его. Следовательно, его форматированный вывод работает всегда.
phpformatter.com работает лучше всего
«Этот бесплатный онлайн-форматировщик PHP предназначен для того, чтобы вы могли украсить весь свой PHP-скрипт в соответствии со стилем, который вы предпочитаете»
Это отличный вопрос. У меня есть приложение, которое читает json и выводит php, html и css. Я запускаю программу и генерирую десятки (сотни?) файлов. Я надеюсь, что ответ здесь полезен.
Я начал свой проект, используя heredocs, специальные включаемые файлы, метасимволы и т. д., но это быстро превратилось в беспорядок. Я хотел автономное решение, которое не требовало фреймворка или 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. Я использую amps, поэтому для меня установлено значение c:\ampps\php.
Было не очень легко найти хороший твердый раствор. Мне также интересно узнать, что другие люди делают для максимально простого пакетного форматирования автоматически сгенерированных файлов php/html для проверки кода и целей архивирования.
У меня было много проблем с поиском достойного бесплатного форматирования для PHP, есть много онлайн-инструментов и инструментов командной строки, но они просто по какой-то причине не работают, результаты все еще полны плохих отступов с комбинациями табуляции и пробелов, и они никогда не получают фигурные скобки так, как вы хотите!
Я попробовал приведенный выше фрагмент, и это тоже не сработало для меня, отступы все еще полны пробелов и вкладок, все смешано.
Так что я тоже попробовал написать простую, в этой просто используются все регулярные выражения, нет причудливой магии компилятора, так что вполне возможно, что она может сломать что-то, и все еще находится в стадии бета-тестирования и тестируется на различном грязном коде. Интерфейс на данный момент тоже очень простой, но он должен улучшиться в ближайшие несколько дней.
Он жестко связан с соглашениями MediaWiki, но вы можете довольно легко изменить его (позже я могу добавить параметры).
https://www.organicdesign.co.nz/Special:CodeTidy