Php 用正则表达式查找/替换数组()

Php 用正则表达式查找/替换数组(),php,arrays,regex,Php,Arrays,Regex,我试图通过我的代码搜索,用速记[]样式替换所有旧式PHParray()s。但是,我在创建一个工作/可靠的正则表达式时遇到了一些问题 我目前拥有的:(^ |[\s])数组\((['”](\s\s)['”]|[^)]*\)(查看) 我已经为它创建了一个 编辑:这不是问题的答案,但另一种选择是使用PHPStorm的传统语法数组文本检测检查 如何: 打开code菜单 单击按名称运行检验…(Ctrl+Alt+Shift+I) 类型检测到传统语法数组文本 按 指定要在其上运行的作用域 按 在检查窗口中查看

我试图通过我的代码搜索,用速记
[]
样式替换所有旧式PHP
array()
s。但是,我在创建一个工作/可靠的正则表达式时遇到了一些问题

我目前拥有的:
(^ |[\s])数组\((['”](\s\s)['”]|[^)]*\)
(查看)

我已经为它创建了一个

编辑:这不是问题的答案,但另一种选择是使用PHPStorm的
传统语法数组文本检测
检查

如何:

  • 打开
    code
    菜单
  • 单击
    按名称运行检验…
    (Ctrl+Alt+Shift+I)
  • 类型
    检测到传统语法数组文本
  • 指定要在其上运行的作用域
  • 检查
    窗口中查看/应用更改

这是可能的,但不是微不足道的,因为您需要完整描述PHP语法的两部分(字符串和注释),以防止括号在其中被解释。下面是一种使用PHP本身的方法:

$pattern = <<<'EOD'
~
(?(DEFINE)
    (?<quotes> (["']) (?: [^"'\\]+ | \\. | (?!\g{-1})["'] )*+ (?:\g{-1}|\z) )
    (?<heredoc> <<< (["']?) ([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) \g{-2}\R
                (?>\N*\R)*?
                (?:\g{-1} ;? (?:\R | \z) | \N*\z)
    )
    (?<string> \g<quotes> | \g<heredoc> )

    (?<inlinecom> (?:// |\# ) \N* $ )
    (?<multicom> /\*+ (?:[^*]+|\*+(?!/))*+ (?:\*/|\z))
    (?<com> \g<multicom> | \g<inlinecom> )

    (?<nestedpar> \( (?: [^()"'<]+ | \g<com> | \g<string> | < | \g<nestedpar>)*+ \) )
)

(?:\g<com> | \g<string> ) (*SKIP)(*FAIL)
|
(?<![-$])\barray\s*\( ((?:[^"'()/\#]+|\g<com>|/|\g<string>|\g<nestedpar>)*+) \)
~xsm
EOD;

do {
    $code = preg_replace($pattern, '[${11}]', $code, -1, $count);
} while ($count);

关于嵌套数组声明:

当前模式仅在找到嵌套数组声明块时才能找到最外层的数组声明


do…while
循环用于处理嵌套数组声明,因为不可能在一个过程中执行多个嵌套级别的替换(但是,有一种方法可以使用
preg\u replace\u回调
但它不是很方便)。要停止循环,使用
preg\u replace
的最后一个参数。此参数包含在目标字符串中执行的替换次数。

这是可能的,但不是微不足道的,因为您需要完整描述PHP语法的两个部分(字符串和注释),以防止括号在其中被解释。下面是一种使用PHP本身的方法:

$pattern = <<<'EOD'
~
(?(DEFINE)
    (?<quotes> (["']) (?: [^"'\\]+ | \\. | (?!\g{-1})["'] )*+ (?:\g{-1}|\z) )
    (?<heredoc> <<< (["']?) ([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) \g{-2}\R
                (?>\N*\R)*?
                (?:\g{-1} ;? (?:\R | \z) | \N*\z)
    )
    (?<string> \g<quotes> | \g<heredoc> )

    (?<inlinecom> (?:// |\# ) \N* $ )
    (?<multicom> /\*+ (?:[^*]+|\*+(?!/))*+ (?:\*/|\z))
    (?<com> \g<multicom> | \g<inlinecom> )

    (?<nestedpar> \( (?: [^()"'<]+ | \g<com> | \g<string> | < | \g<nestedpar>)*+ \) )
)

(?:\g<com> | \g<string> ) (*SKIP)(*FAIL)
|
(?<![-$])\barray\s*\( ((?:[^"'()/\#]+|\g<com>|/|\g<string>|\g<nestedpar>)*+) \)
~xsm
EOD;

do {
    $code = preg_replace($pattern, '[${11}]', $code, -1, $count);
} while ($count);

关于嵌套数组声明:

当前模式仅在找到嵌套数组声明块时才能找到最外层的数组声明


do…while
循环用于处理嵌套数组声明,因为不可能在一个过程中执行多个嵌套级别的替换(但是,有一种方法可以使用
preg\u replace\u回调
但它不是很方便)。要停止循环,使用
preg\u replace
的最后一个参数。此参数包含在目标字符串中执行的替换次数。

无法使正则表达式对此100%可靠地工作。事实上,根本没有实际的理由这么做。一致性对我来说已经足够了,特别是在自动化流程中。我明白为什么这会吸引你,但我同意@Jon在这个具体案例中的观点。举个例子——如果你把代码中的所有整数都改成字符串,你是一致的,但你并不实际。把整数改成字符串会适得其反,会导致错误,这不是语法上的改变。完全不同。不管怎样,这个问题不是很实际,而是关于正则表达式。你不能让正则表达式100%可靠地工作。事实上,根本没有实际的理由这么做。一致性对我来说已经足够了,特别是在自动化流程中。我明白为什么这会吸引你,但我同意@Jon在这个具体案例中的观点。举个例子——如果你把代码中的所有整数都改成字符串,你是一致的,但你并不实际。把整数改成字符串会适得其反,会导致错误,这不是语法上的改变。完全不同。不管怎样,这个问题不是很实际,而是关于正则表达式。
(?<![-$])\b        # check if "array" is not a part of a variable or function name
array \s*\(
(                   # capture group 11
    (?:             # describe the possible content
        [^"'()/\#]+ # all that is not a quote, a round bracket, a slash, a sharp
      |             # OR
        \g<com>     # a comment
      |
        /           # a slash that is not a part of a comment
      |
        \g<string>  # a string
      |
        \g<nestedpar> # nested round brackets
    )*+
)
\)