你知道任何好的工具来很好地格式化凌乱的PHP代码吗?最好是Aptana / Eclipse的脚本,但也可以使用独立的工具。
答案 0 :(得分:41)
这是我非常基本和粗略的脚本:
#!/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;
}
}
答案 1 :(得分:15)
http://en.sourceforge.jp/projects/pdt-tools/
^^^将为您提供适当的CTRL + SHIFT + F Eclipse / Aptana PHP格式化程序,如Java。
有关安装帮助,请参阅here。
答案 2 :(得分:12)
PHP Code Beautifier是一款非常有用的免费工具,可以完成你所追求的工作,尽管他们的download page确实需要创建一个帐户。
该工具已被拒绝为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;
}
}
}
答案 3 :(得分:6)
有一个梨形模块可以格式化你的代码。 PHP Beautifier
答案 4 :(得分:5)
如果您使用Zend Development Environment,您可以使用缩进代码功能(Ctrl + Shift + F)。
答案 5 :(得分:4)
答案 6 :(得分:4)
使用NetBeans PHP并按alt + shift + F。
答案 7 :(得分:3)
Zend Development Environment现在是一个Eclipse插件,您可以将其与Aptana一起运行,并使用它的缩进代码功能。
我还没有升级到Eclipse插件,我非常喜欢以前的ZDE。虽然现在我已经开始将Eclipse用于其他语言,但我几乎准备好实现这一目标。
答案 8 :(得分:2)
这个怎么样:
http://universalindent.sourceforge.net/
它结合了许多格式化程序,并将生成您需要的脚本,以便您可以将它们传递出去并让您的团队成员在下次提交之前使用它们...虽然...格式化程序可能会弄乱您的代码并使其无法使用......
答案 9 :(得分:2)
最简单的解决方案是使用内置的IDE。如果您要定期在PHP中编写代码,只需花费60美元购买PHPStorm。你不会后悔的。
http://www.jetbrains.com/phpstorm/
它允许您格式化代码,但是您喜欢在文件或目录级别使用简单的键盘快捷键,并且具有许多其他强大的功能。
答案 10 :(得分:1)
我们的 PHP Formatter会可靠地格式化您的代码。它使用基于编译器的前端来解析代码,因此它不会误解代码并对其造成损害。因此,其格式化输出始终有效。
答案 11 :(得分:1)
phpformatter.com效果最佳
“这个免费的在线PHP格式化程序的设计使您可以使用您喜欢的样式美化所有PHP脚本”
答案 12 :(得分:0)
这是一个很好的问题。我有一个应用程序,读取json并输出php和html和css。我运行一个程序并生成数十(数百?)个文件。我希望这里的答案很有用。
我使用heredocs,特殊包含文件,元字符等开始我的项目,但很快就变得一团糟。我想要一个不需要框架或ide的独立解决方案。所以我删除了所有heredoc和其他垃圾并创建了一个通用文本缓冲类,而不用考虑格式化。对于我所关心的一切,它都可以是一条线。对于html,我做了tidy()内置。对于php,我使用phpstylist。 phpstylist较旧但仍适用于php格式。
要在windows gui中设置我使用的UniversalIndent(2012年1月更新)的phpstylist选项。
UniversalStylist列出了24个(!)格式化程序(c,php,ruby,html,...)。它特别知道phpstylist的选项,并在您打开和关闭选项时为您提供文件的实时刷新。很好。然后,当您拥有自己的样式时,它可以选择保存命令行选项并生成脚本。对于某些格式化选项,您必须添加到perl,python等的路径
如果您正在使用Windows并希望使用UniversalIndent尝试phpstylist,只需将php.exe的目录添加到您的env路径即可。我使用ampps因此我的设置为c:\ ampps \ php。
找到一个好的固体溶液并不是一件容易的事。我也有兴趣听听其他人为了代码审查和归档目的而对自动生成的php / html文件进行简单的批量格式化操作。
答案 13 :(得分:-1)
我在为PHP找到一个不错的免费格式化程序时遇到了很多麻烦,有很多在线和命令行工具,但它们似乎似乎没有工作因为某些原因,结果都是满的使用制表符和空格的组合进行不良缩进,并且它们永远不会以您希望的方式获得大括号!
我尝试了上面的代码片段,这对我来说也不起作用,缩进仍然充满空格和标签混合起来。
所以我已经开始编写一个简单的了,这个只使用所有正则表达式,没有花哨的编译器魔法,所以它可能会破坏事物,并且仍然非常beta并且在各种凌乱的代码上进行测试。该界面目前也非常基础,但在接下来的几天内应该会有所改善。
它与MediaWiki的约定硬连线,但你可以很容易地修改它(我可能会在以后添加选项)。