php - 将文本拆分为关联数组

标签 php regex

假设我有这样的文字:

add name=100YER on-login=":do {:put \"a\";} on-error={};" rate-limit=256k/512k

我想提取一个包含键和值的数组,例如:

{
    "name": "100YER",
    "on-login": ":do {:put \"a\";} on-error={};"
    "rate-limit": "256k/512k"
}

如果有另一个值包含 = 字符怎么办?

我使用此正则表达式将其拆分为 =,但问题出在登录值中。

if (preg_match_all('/[^=]+/i', $response, $MATCHES) ){
    //
}

最佳答案

您可以使用 2 个捕获组和一个分支重置组:

(\w+(?:-\w+)*)=(?|"((?:[^"]+|(?<=\\)")++)"|([^"\s]+))

说明

  • (捕获组 1
    • \w+(?:-\w+)*匹配 1 个以上单词字符,可选后跟 -和 1 个以上单词字符
  • )关闭第 1 组
  • =按字面意思匹配
  • (?|分支重置组
    • "(匹配"并开始第2组
      • (?:[^"]+|(?<=\\)")++匹配除 " 之外的任何字符或\"
    • )"关闭第 2 组并匹配 "
    • |或者
    • ([^"\s]+)捕获组 3,匹配除 " 之外的任何字符或空白字符
  • )关闭分支重置组

Regex demo | Php demo

例如

$re = '/(\w+(?:-\w+)*)=(?|"((?:[^"]+|(?<=\\\\)")++)"|([^"\s]+))/';
$str = 'add name=100YER on-login=":do {:put \\"a\\";} on-error={};" rate-limit=256k/512k';

preg_match_all($re, $str, $matches);
$result = array_combine($matches[1], $matches[2]);
print_r($result);

输出

Array
(
    [name] => 100YER
    [on-login] => :do {:put \"a\";} on-error={};
    [rate-limit] => 256k/512k
)

关于php - 将文本拆分为关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64198123/

相关文章:

regex - 递归搜索以字符串开头的目录以查找内部目录匹配模式

正则表达式 - 挤压空格并删除名称中的点

php - 按组更新数据库中的用户记录

PHP MYSQL VALUE 变量

php - 通过 php 将数据插入 MySQL,并指定过期日期

php - 使用 HSL 在 php 中着色

php - 解析 - JSON - 数组的数组

javascript - 无法弄清楚如何确保最后的模式

c# - 正则表达式数字和小数点

regex - 匹配(C)函数调用的正则表达式