簡體   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