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);