0

我被分配了一个项目,该项目的关联数组到处都没有单引号。

例子:

$foo[bar]

应该是:

$foo['bar']

这会生成一个 PHP 通知,这是非常糟糕的做法。

引用PHP.net

这是错误的,但它有效。原因是这段代码有一个未定义的常量(bar)而不是字符串('bar' - 注意引号)。PHP 将来可能会定义常量,不幸的是,对于此类代码,这些常量具有相同的名称。它之所以有效,是因为 PHP 会自动将一个裸字符串(一个不与任何已知符号对应的未加引号的字符串)转换为包含该裸字符串的字符串。例如,如果没有定义名为 bar 的常量,那么 PHP 将替换字符串 'bar' 并使用它。

而且它对性能不利,因为它必须在使用之前搜索一个常数'key'

所以我想知道是否有人知道一个脚本可以实现这一点,而不必为每个文件一个一个地手动完成。

更新:

我使用 Vim 作为编辑器,我知道如何在单个文件中使用它的搜索和替换命令,但是我发现这有两个问题:

  1. 我无法搜索和替换这样的东西,因为我认为它不支持正则表达式。

  2. 它仅适用于当前打开的文件(据我所知)。

4

4 回答 4

1

您的文本编辑器不支持使用正则表达式进行全局搜索和替换吗?

我可能会搜索类似的东西:

(\$[a-zA-Z0-9]+\[)([^\]]+)\]

并替换为

\1'\2']

正则表达式搜索+替换对于大量源文件的广泛更改非常有用。虽然确保在进行全局更改之前拍摄代码快照,然后验证您想要更改的所有内容都已更改,没有意外的副作用。

更新:

根据他/她正在使用 vim 的 OP 更新,请参阅此帖子的已接受答案:Apply regular expression substitution global to many files with a script ,该脚本描述在 vim 中的多个文件上使用正则表达式搜索/替换。

类似 sed 的语法向我表明,您正在寻找的命令(未经测试)是:

:args **/*.php | argdo %s/(\$[a-zA-Z0-9]+\[)([^\]]+)\]/\1'\2'/ge | update

您可能需要稍微调整一下,所以在修改所有文件之前进行备份。我建议您也尝试找到一个对用户更友好的 IDE。

于 2013-02-15T09:25:11.420 回答
1

您是否在 IDE 中进行搜索和替换?如果是这样使用它。这可能需要一些时间,但您需要小心一次性更改所有这些。

于 2013-02-15T09:25:34.663 回答
1

这将是 vim 的另一种可能的解决方案:

:%s/\[\(\h*\)\]/\['\1'\]/gc

这将改变以下所有实例:

[foo]

到:

['foo']

并会提示确认。

以下示例将保持不变(应该如此):

[$foo]
["foo"]
['foo']
[123]
于 2013-03-01T08:20:45.473 回答
0

使用 IDE 对项目进行查找和替换。它们中的大多数都允许您在搜索字符串中放置一个正则表达式,因此只要它与模式匹配,请替换[['和。]']

于 2013-02-15T09:25:33.307 回答