如何编写正则匹配多行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
相关产品推荐
相关产品推荐

