Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式替换重复模式_Php_Arrays_Regex - Fatal编程技术网

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

Php 使用正则表达式替换重复模式,php,arrays,regex,Php,Arrays,Regex,我想替换源代码中所有未引用的数组键: $array[keyValue] 使用带引号的数组键: $array['keyValue'] 对于一维数组,此regexp允许我执行以下操作: preg_replace('/\$([a-z-_0-9]+)(\[([a-z][a-zA-Z-_0-9]+)\])+/', '\$$1['$3']', $input_lines); 测试: 注意我所有的钥匙都以小写字母开头 当我有多维数组并且我想更改时,我的问题出现了: $array[keyValue1][ke

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

$array[keyValue]
使用带引号的数组键:

$array['keyValue']
对于一维数组,此regexp允许我执行以下操作:

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

注意我所有的钥匙都以小写字母开头

当我有多维数组并且我想更改时,我的问题出现了:

$array[keyValue1][keyValue2]
致:

甚至

$array[keyValue1]...[keyValueN]

对于更大尺寸的ed阵列。我多次尝试匹配图案都会导致第一个开口支架
[
和最后一个支架
]
之间匹配为一个匹配

编辑:这样做的原因是为了避免这样的错误和通知

E_NOTICE : type 8 -- Use of undefined constant key - assumed 'key' -- at line 2 
在我的日志中

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

您需要使用
\G
进行连续匹配。使用以下正则表达式替换
preg\u

(\$\w+\[|\G(?!\A)\[)([^]['"]+)\]
并将以下字符串作为替换字符串:

$1'$2']

PHP代码:

preg_replace('~(\$\w+\[|\G(?!\A)\[)([^][\'"]+)\]~', '$1\'$2\']', $str);
正则表达式细分:

  • 开始捕获组#1
    • \$\w+\[
      匹配一个
      $
      然后是一些单词字符,然后是一个左括号
    • |
    • \G(?!\A)
      从上一个匹配结束的位置开始匹配
    • \[
      匹配开口括号
  • 捕获组结束#1
  • 开始捕获组#2
    • [^]['”]+
      匹配除
      [
      ]
      '
  • 捕获组结束#2
  • \]
    匹配右括号

您是否理解从技术上讲,
$array[keyValue1]
不应该存在?键应该是字符串。因此您希望sting引用自身?因此下次在代码中您需要处理类似于
$array['\'keyValue1\''的元素
?我只是想知道是谁对这个奇怪的问题投了赞成票?有什么理由让你们感兴趣吗?不是我。我只是为了好玩而检查了代码。看到两个警告,在
var\u dump(array(myKey=>array(myValue=>0))上得到了
array(size=1)'myKey'=>array(size=1)'myValue'=>int 0
);
@Alex什么让你觉得奇怪?@revo查看我的第一条评论。我甚至花了一些时间用例子解释-请按照评论中的链接-预定义常量都是大写的…谢天谢地:-)所以这不应该是个问题。我得到的是“未定义常量,假设它是一个键”日志中的注意事项…然后要排除这些常量(如果可以将它们用作键),请使用
(\$\w+\[\G(?!\a)\[)(?![a-Z][a-Z\d\]*\]([^]['“]+)\]
。请参阅此处的实时演示
$array[$keyValue1][$keyValue2]
?它是用来引用变量的;-)@Alex不,它不适用于变量,也不容易。到目前为止,OP讨论的是一些常量/字符串,而不是变量。因此,这个答案存在是可以的。
$1'$2']
preg_replace('~(\$\w+\[|\G(?!\A)\[)([^][\'"]+)\]~', '$1\'$2\']', $str);