Php 如何修复多个文件中缺少单引号的关联数组键
我被分配了一个项目,该项目具有关联数组,没有任何单引号 例如:Php 如何修复多个文件中缺少单引号的关联数组键,php,regex,bash,sed,replace,Php,Regex,Bash,Sed,Replace,我被分配了一个项目,该项目具有关联数组,没有任何单引号 例如: $foo[bar] 应该是: $foo['bar'] 这会生成一个PHP通知,这是非常糟糕的做法 引述自: 这是错误的,但它是有效的。原因是此代码具有 未定义的常量(bar)而不是字符串('bar'-请注意 引用)。PHP将来可能会定义常量,不幸的是 这样的代码,有相同的名称。它之所以能工作,是因为PHP自动运行 转换裸字符串(不对应的无引号字符串 到任何已知符号)转换为包含裸字符串的字符串。对于 实例,如果没有定义名为bar的
$foo[bar]
应该是:
$foo['bar']
这会生成一个PHP通知,这是非常糟糕的做法
引述自:
这是错误的,但它是有效的。原因是此代码具有
未定义的常量(bar)而不是字符串('bar'-请注意
引用)。PHP将来可能会定义常量,不幸的是
这样的代码,有相同的名称。它之所以能工作,是因为PHP自动运行
转换裸字符串(不对应的无引号字符串
到任何已知符号)转换为包含裸字符串的字符串。对于
实例,如果没有定义名为bar的常量,那么PHP将
替换字符串“bar”并使用它
而且它对性能不好,因为在使用'key'
所以我想知道是否有人知道一个脚本可以实现这一点,而不必为每个文件逐个手动执行
更新:
我使用Vim作为编辑器,我知道如何在单个文件中使用它的search和replace命令,但是我发现这有两个问题:
您的文本编辑器是否不支持使用正则表达式进行全局搜索和替换 我可能会搜索以下内容:
(\$[a-zA-Z0-9]+\[)([^\]]+)\]
并替换为
\1'\2']
正则表达式搜索+替换对于大量源文件的广泛更改非常有用。尽管如此,在进行全局更改之前,请确保对代码进行了快照,并在更改之后验证您希望更改的所有内容都已更改,没有意外的副作用
更新:
根据OP关于他/她正在使用vim的更新,请参阅本文的公认答案:它描述了在vim中对多个文件使用正则表达式搜索/替换
sed-like语法向我表明,您正在查找(未测试)的命令是:
:args**/*.php | argdo%s/(\$[a-zA-Z0-9]+\[)([^\]+)\]/\1'\2'/ge更新
你可能需要稍微修改一下,所以在修改所有文件之前做一个备份。我建议您也尝试寻找一个更为用户友好的IDE。您的文本编辑器是否不支持使用正则表达式进行全局搜索和替换 我可能会搜索以下内容:
(\$[a-zA-Z0-9]+\[)([^\]]+)\]
并替换为
\1'\2']
正则表达式搜索+替换对于大量源文件的广泛更改非常有用。尽管如此,在进行全局更改之前,请确保对代码进行了快照,并在更改之后验证您希望更改的所有内容都已更改,没有意外的副作用
更新:
根据OP关于他/她正在使用vim的更新,请参阅本文的公认答案:它描述了在vim中对多个文件使用正则表达式搜索/替换
sed-like语法向我表明,您正在查找(未测试)的命令是:
:args**/*.php | argdo%s/(\$[a-zA-Z0-9]+\[)([^\]+)\]/\1'\2'/ge更新
你可能需要稍微修改一下,所以在修改所有文件之前做一个备份。我建议您也尝试寻找一个更为用户友好的IDE。使用IDE对项目进行查找和替换。它们中的大多数都允许您在搜索字符串中放置正则表达式,因此每当正则表达式与模式匹配时,就使用IDE对项目进行查找和替换。它们中的大多数都允许您在搜索字符串中放入正则表达式,因此每当它与模式匹配时,您是否使用IDE进行搜索和替换?如果是这样的话,就用这个。这可能需要一些时间,但您需要小心,不要一次就全部更改。您是否执行搜索和替换?如果是这样的话,就用这个。这可能需要一些时间,但您需要小心,不要一次就更改所有这些选项。这将是vim的另一个可能解决方案:
:%s/\[\(\h*\)\]/\['\1'\]/gc
这将更改以下所有实例:
[foo]
致:
并将提示确认
以下示例将保持不变(应如此):
这将是vim的另一种可能解决方案:
:%s/\[\(\h*\)\]/\['\1'\]/gc
这将更改以下所有实例:
[foo]
致:
并将提示确认
以下示例将保持不变(应如此):
如果在某些地方确实使用了常数,这可能会非常困难。如果您确定没有使用常数,下面是一个使用工具sed和regexps的指导:如果在某些地方确实使用了常数,这可能会非常困难。如果您确定没有使用常数,下面是一个如何使用工具sed和regexps:正则表达式不起作用,但是我认为您已经指出了解决这个问题的正确方法。谢谢。正则表达式不起作用,但是我认为您已经指出了解决此问题的正确方法。谢谢