假设我有这样的文字:
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,匹配除"
之外的任何字符或空白字符
-
-
)
关闭分支重置组
例如
$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/