【问题标题】:RegEx - Match all unquoted strings in brackets except if they are all capital-lettersRegEx - 匹配括号中所有未引用的字符串,除非它们都是大写字母
【发布时间】:2019-01-12 21:37:12
【问题描述】:

在 PHP 7.2 中,manual 表示:

不存在的全局常量的不带引号的字符串被带到 成为自己的字符串。此行为用于发出 E_NOTICE,但 现在将发出 E_WARNING。在 PHP 的下一个主要版本中,出现错误 反而会抛出异常。

另外,像 $list[products_name] 这样的代码现在会产生这个警告:

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

我现在已经切换到 PHP 7.2 并获得了我想要搜索和替换的代码,方法是匹配括号内所有未引用的字符串并向它们添加单引号(例如,$list[products_name] 将变为 $list['products_name']),除了都是大写的字符串。我想特别跳过这些的原因是因为很多时候它们确实是常量,我不应该把它们放在引号内。 我是正则表达式的新手,并尝试了几种选择。到目前为止,我已经想出了这个正则表达式:

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

它适用于我需要的大多数用途,除了它仍然捕获代码块中的所有大写字符串,如下所示:

$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];

DEMO

如何将其修改为不匹配 DONTCAPTUREME 之类的示例?

谢谢

【问题讨论】:

    标签: php regex search replace


    【解决方案1】:

    在第一个 \[ 之后,对全大写使用负前瞻,然后是 \]

    \$\w+\[(?![A-Z]+\])([a-zA-Z_]+[\w]+)\]
           ^^^^^^^^^^^^
    

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

    【讨论】:

    • 我知道这不是原始问题的一部分,但我怎样才能让它也跳过DONT_CAPTURE_ME。我尝试过使用\$\w+\[(?![A-Z_]+\])([a-zA-Z_]+[\w]+)\],但这也跳过了我确实需要捕获的许多其他内容。所以我基本上只需要跳过所有大写字母和所有大写字母+_。
    • 只需将_ 添加到负前瞻regex101.com/r/I91TNn/4 中的字符集中另一种选择是正向前瞻,而不是\],重复,后跟小写\$\w+\[(?=[^\]]*[a-z])([a-zA-Z_]+[\w]+)\]
    • also skips many other ones 你能在 regex101 上复制这个问题吗?我很好奇
    • 我不能,在 regex101 上工作正常。我正在使用 grepWin,它通常适用于这些,但出于某种原因 - 这次不是。它确实选择像$actionKey = $get[AM_ACTION_GET_VARIABLE]; 这样的行还有其他方法来执行此正则表达式吗?
    • 问题是程序默认设置为不区分大小写搜索。将此更改为区分大小写的正则表达式搜索可解决该问题。再次感谢。
    【解决方案2】:

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

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

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

    替换为:

    '\2' 
    

    在进行此类操作之前,请务必备份您的文件。

    DEMO

    Screenshot Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多