Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何修复多个文件中缺少单引号的关联数组键_Php_Regex_Bash_Sed_Replace - Fatal编程技术网

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:正则表达式不起作用,但是我认为您已经指出了解决这个问题的正确方法。谢谢。正则表达式不起作用,但是我认为您已经指出了解决此问题的正确方法。谢谢