使用 PCRE 正则表达式解析多行 ini 之类的文件

Dar*_*tic 4 php regex pcre

我有一个类似 ini 的文件,其中有<key> = <value>项目列表。使事情复杂化的是某些值是多行的并且可以包含=字符(tls 私钥)。例子:

groupid = foo
location = westus
randomkey = fbae3700c34cb06c
resourcename = example4-resourcegroup
tls_private_key = -----BEGIN RSA PRIVATE KEY-----
//stuff
-----END RSA PRIVATE KEY-----

foo = 123
faa = 223
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所拥有的模式是这样的/^(.*?)\ \=\ (.*[^=]*)$/m,它适用于除 tls_private_key 之外的所有键,因为它包含=所以它只获取部分值。

有什么建议?

The*_*ird 5

您可以匹配多行上的所有值,断言下一行不包含空格等号空格:

^(.*?) = (.*(?:\R(?!.*? = ).*)*)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

如果键不能有空格:

^([^\s=]+)\h+=\h+(.*(?:\R(?![^\s=]+\h+=\h+).*)*)$
Run Code Online (Sandbox Code Playgroud)

解释

  • ^ 字符串的开始
  • ([^\s=]+)捕获组 1,匹配 1+ 个字符=或空白字符以外的字符
  • \h+=\h+=在空格之间匹配一个
  • (捕获组 2
    • .* 匹配整行
    • (?:\R(?![^\s=]+\h+=\h+).*)* 重复以下所有不包含空格 = 空格的行
  • ) 关闭捕获组 2
  • $ 字符串结束

正则表达式演示