正则表达式-匹配括号中所有未引用的字符串,除非它们都是大写字母

时间:2018-08-05 23:16:28

标签: php regex search replace

在PHP 7.2中,manual表示:

  

不存在的全局常量不带引号的字符串被带到   做自己的事。这种行为曾经发出 E_NOTICE ,但是   现在将发出 E_WARNING 。在PHP的下一个主要版本中,错误   将会抛出异常。

此外,像这样的$list[products_name]这样的代码现在将产生以下警告:

  

警告:使用未定义的常量products_name-假定为“ products_name”   (在%d行中)在%s中(这会在PHP的未来版本中引发错误)

我现在已切换到PHP 7.2,并通过匹配括号内的所有未加引号的字符串并向其添加单引号来获取要搜索和替换的代码(例如$list[products_name]将变为{{1 }}),但所有大写的字符串除外。我想专门跳过这些内容的原因是,很多时候它们确实是常量,因此我不应该将它们放在引号中。 我是regex的新手,并尝试了几种选择。到目前为止,我想出了这个正则表达式:

$list['products_name']

对于大多数我需要的目的来说,它都能很好地工作,除了它仍然可以捕获如下代码块中的所有大写字符串:

\$\w+\[([a-zA-Z_]+[\w]+)\]

DEMO

如何修改它,使其不只匹配$options[$list[_option_id]][]=array($list[_value],$list[_value_id]); $option_names[$list[_option_id1]]=$list[_option]; $product_name=$list[products_name]; $product_name=$list[0]; $product_name=$list[DONTCAPTUREME]; $product_name=$list[CapTureMe]; $product_name=$list[CapTurEME]; 之类的示例?

谢谢

2 个答案:

答案 0 :(得分:3)

在第一个"styles": [ { "input": "node_modules/bootstrap/dist/css/bootstrap.min.css" }, "src/styles.css" ], 之后,对所有大写字母使用负前瞻,后跟\[

\]

https://regex101.com/r/I91TNn/3

答案 1 :(得分:1)

最后,最适合我的解决方案(使用grepWin)是:

搜索(区分大小写必须启用):

(").*?\1(*SKIP)(*FAIL)|\$\w+\]?\[(?!\w*\(|\w*:)(?=[^\]]*[a-z])(\K[a-zA-Z_]+[\w]+)

替换为:

'\2' 

始终在执行此操作之前备份文件。

DEMO

Screenshot Here