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