使用正则表达式替换重复模式

时间:2018-11-15 13:48:23

标签: php arrays regex

我想替换源代码中所有未加引号的数组键:

$array[keyValue]

带引号的数组键:

$array['keyValue']

对于单维数组,此正则表达式允许我执行以下操作:

preg_replace('/\$([a-z-_0-9]+)(\[([a-z][a-zA-Z-_0-9]+)\])+/', '\$$1['$3']', $input_lines);

测试:https://www.phpliveregex.com/p/pXc

请注意,我所有的键都以小写字母开头。

当我有多维数组并且想要更改时,我的问题就来了:

$array[keyValue1][keyValue2]

至:

$array['keyValue1']['keyValue2']

甚至

$array[keyValue1]...[keyValueN]

$array['keyValue1']...['keyValueN']

用于较大尺寸的数组。我尝试多次匹配模式都会导致第一个左括号[与最后一个]之间的匹配。

编辑:执行此操作的原因是为了避免出现此类错误和通知

E_NOTICE : type 8 -- Use of undefined constant key - assumed 'key' -- at line 2 

在我的日志中

1 个答案:

答案 0 :(得分:3)

注意:请注意预定义的常量。这不是也不能忽略它们。

您需要使用\G进行连续比赛。将preg_replace与以下正则表达式一起使用:

(\$\w+\[|\G(?!\A)\[)([^]['"]+)\]

,然后将以下字符串作为替换字符串:

$1'$2']

请参见live demo here

PHP代码:

preg_replace('~(\$\w+\[|\G(?!\A)\[)([^][\'"]+)\]~', '$1\'$2\']', $str);

正则表达式细分:

  • (开始捕获#1组
    • \$\w+\[匹配一个$,然后匹配一些单词字符,然后匹配一个开括号
    • |
    • \G(?!\A)从上一场比赛结束的地方开始比赛
    • \[匹配左括号
  • )捕获#1组结束
  • (开始捕获#2组
    • [^]['"]+匹配[]'"以外的任何内容
  • )捕获#2组结束
  • \]匹配右括号