繁体   English   中英

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

[英]Replace a repeating pattern using 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 

在我的日志中

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

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

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

并将以下字符串作为替换字符串:

$1'$2']

在这里查看现场演示

PHP代码:

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

正则表达式崩溃:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM