我需要有关 PHP 中的正则表达式的帮助。我有一个包含大量数据的字符串,格式可能是这样的。
key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23
所以我有 2 个分隔符,并且 = where 是键和值的集合。问题是 key 和 value 可以包含相同的符号 和 = 但它们总是会被转义。所以我不能使用爆炸。我需要使用 preg_split 但我不擅长正则表达式。
有人可以帮我解决这个问题吗?
我需要有关 PHP 中的正则表达式的帮助。我有一个包含大量数据的字符串,格式可能是这样的。
key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23
所以我有 2 个分隔符,并且 = where 是键和值的集合。问题是 key 和 value 可以包含相同的符号 和 = 但它们总是会被转义。所以我不能使用爆炸。我需要使用 preg_split 但我不擅长正则表达式。
有人可以帮我解决这个问题吗?
您需要使用负面的lookbehind:
// 4 backslashes because they are in a PHP string, so PHP translates them to \\
// and then the regex engine translates the \\ to a literal \
$keyValuePairs = preg_split('/(?<!\\\\),/', $input);
这将拆分每个,
未转义的内容,因此您将获得键值对。您可以对每一对执行相同的操作来分隔键和值:
list($key, $value) = preg_split('/(?<!\\\\)=/', $pair);
@Jon 的回答很棒。我虽然通过匹配字符串来提供解决方案:
preg_match_all('#(.*?)(?<!\\\\)=(.*?)(?:(?<!\\\\),|$)#', $string, $m);
// You'll find the keys in $m[1] and the values in $m[2]
$array = array_combine($m[1], $m[2]);
print_r($array);
输出:
Array
(
[key] => value
[e4354ahj\,] => awet3
[asdfa\=asdfa] => 23f23
)
解释:
(.*?)(?<!\\\\)=
:匹配任何东西并将其分组,直到=
前面没有\
(.*?)(?:(?<!\\\\),|$)
:匹配任何内容并将其分组,直到,
前面没有\
或行尾。