You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则匹配多行PHP数组中未被引号包裹的数组值

PHP数组未被引号包裹值匹配解决方案

你提供的测试数组如下:

[
    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
]

原有正则的问题在于固定了值的结束后缀,仅能匹配特定结构的三目表达式,且未排除单引号包裹的内容,通用性差,也不支持任意多行值匹配,以下是两种可行方案:

1. 直接跨行匹配方案

直接使用支持跨行的正则即可覆盖所有场景,无需预处理,正则如下:

=>\s*(?![\'"])([\s\S]+?)(?=\s*(?:,|\])(?:[^'"]*(['"])[^'"]*\2)*[^'"]*$)

使用时需开启多行修饰符m,捕获组1即为你需要的未被引号包裹的数组值。
该正则逻辑为:

  • 匹配=>加后续空白后,先通过负向预查排除开头就是单/双引号的被包裹值
  • 捕获所有字符直到碰到值结束边界(逗号或数组闭合方括号),同时会跳过值内部字符串里的结束符号,避免提前截断
  • 可完美匹配options字段这类多行的复杂表达式值

2. 换行预处理方案

如果你更倾向于先把数组整理为单行键值对结构,可使用以下正则做替换预处理:

  • 查找规则:\n(?!\s*['"]|.*,\s*$)
  • 替换为:空字符串
    该规则会删除所有不必要的换行,仅保留数组键行、以及键值对结束行的换行,处理后所有数组值都会变成单行,即可用普通单行正则匹配。

内容的提问来源于stack exchange,提问作者jonas18175

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:03