【问题标题】:Replace a repeating pattern using regex使用正则表达式替换重复模式
【发布时间】:2018-11-15 13:48:23
【问题描述】:

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

$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 

在我的日志中

【问题讨论】:

  • 您知道从技术上讲$array[keyValue1] 不应该存在吗?键应该是一个字符串。所以你想要一个刺痛引用自己?所以下次在您的代码中,您将需要解决像$array['\'keyValue1\''] 这样的元素? ideone.com/uFXrqV
  • 我只是想知道谁赞成这个奇怪的问题?任何意见为什么这对你们来说很有趣?
  • 不是我。我只是为了好玩而检查了代码。看到两个警告并在var_dump(array(myKey => array(myValue => 0))); 上获得了array (size=1) 'myKey' => array (size=1) 'myValue' => int 0
  • @Alex 是什么让你觉得它奇怪
  • @revo 检查我的第一条评论。我什至花了一些时间来举例说明——请点击评论中的链接

标签: php arrays regex


【解决方案1】:

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

您需要使用\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 结束
  • \] 匹配右括号

【讨论】:

  • 预定义的常量都是大写的...谢天谢地:-) 所以这应该不是问题。我在日志中收到“未定义的常量,假设它是一个键”通知...
  • 然后排除这些常量(如果可以将它们用作键)使用(\$\w+\[|\G(?!\A)\[)(?![A-Z][A-Z\d_]*\])([^]['"]+)\]。在此处查看现场演示regex101.com/r/EWrAH8/2
  • $array[$keyValue1][$keyValue2] 怎么样? regex101.com/r/EWrAH8/3 是用来引用变量的吗 ;-)
  • @Alex 不,它不适用于变量,也不容易。到目前为止,OP 谈论的是一些常量/字符串而不是变量。所以这个答案存在就好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2019-03-29
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多