使用Perl重新格式化PHP代码

时间:2011-09-15 07:26:41

标签: php regex perl

想象一下,我们有以下PHP代码:

if (true)
{
    doSomething();
}

但我们希望:

if (true) {
    doSomething();
}

我认为我们可以使用Perl就地批量编辑工具在整个代码库中进行这种更改。

但是我无法让它匹配换行符后跟空格然后支撑。

这是我正在尝试的事情

perl -pi -w -e 's/if(.*)\n\s+\{/if$1 \{/g'  testfile.php

我完全失去了;如果我不包括空格和大括号,它匹配。但那不是很有帮助。

3 个答案:

答案 0 :(得分:3)

使用-p使Perl循环遍历文件的行,一次一行,从而阻止您在多行上匹配内容。

您可以使用-0将输入记录分隔符设置为null,并使Perl立即读取整个文件。 (见perlrun。)

您可以尝试这样的事情:

perl -p0iwe 's/\bif\b(.*)\n\s*\{/if$1 \{/g' test.php

请注意,这不是编辑PHP的好方法。字符串,注释和文件的文本内容只是容易打破这种简单解决方案的一些事情。我建议为这份工作找到合适的工具。一些编辑器/ IDE支持(重新)格式化代码,也许您可​​以尝试其中一种。

答案 1 :(得分:1)

如果您想更改Perl代码库,我强烈建议您使用Perl::Tidy。但我认为,PHP有一个类似的工具。

您可以浏览一次可能的选项并定义您喜欢的样式。将其保存在配置文件中并重新格式化整个代码库。您甚至可以将此步骤作为提交挂钩添加到您的版本控制系统,以使其具有一致的外观。

与正则表达式相比,它有两大优势:

  1. 您可以节省时间,因为您可以在一次运行中定义所有样式首选项。假设需要两个小时。我没有看到你在同一时间编写涵盖相同数量选项的正则表达式。
  2. 更重要的是(虽然你可能会说,这种情况从未发生过,但它肯定会发生):迟早你会得到一些特殊的代码,而你的正则表达式并未涵盖这些代码。可能是未检测到的if或与正则表达式匹配的其他构造,但不应替换。在最好的情况下,您的重整器崩溃,您必须调整您的正则表达式。在最糟糕的情况下,重组器会在您的代码中引入错误,您甚至不会注意到 - 直到代码运行。

答案 2 :(得分:0)

使用Perl :: Tidy或其命令行工具perltidy。

我建议您使用PHP代码并在一段时间后重新格式化源代码。将它按块复制并粘贴到一个空文本文件中(以便PHP片段仍然是语法上有效的Perl代码),然后对该文件进行处理。如果足够,请替换回您的PHP代码文件。

这样,您可以使用Perl :: Tidy格式化复杂的,嵌套的PHP数据结构(总比没有好)。

perltidy不能用于格式化通用PHP代码(仅作为示例,PHP的/ * * / C风格的多行注释是perltidy的问题)

AFAIK知道,没有像perltidy那样强大的PHP美化器。几年前我一直在寻找这个;所以同时,事情可能已经改变了。