PHP preg_split需要正则表达式

时间:2013-06-13 09:12:26

标签: php regex preg-split

我需要PHP中的正则表达式的帮助。 我有一个包含大量数据的字符串,格式可能是这样的。

key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23

所以我有2个分隔符,= = where,是键和值的集合。问题是键和值可以包含相同的符号,并且=但它们将始终被转义。所以我不能使用爆炸。我需要使用preg_split,但我不擅长正则表达式。

有人可以帮我一把吗?

2 个答案:

答案 0 :(得分:4)

您需要使用negative 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);

<强> See it in action

答案 1 :(得分:1)

<@> @ 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
)

<强>解释

  • (.*?)(?<!\\\\)=:匹配任何内容并将其分组,直到=前面没有\
  • (.*?)(?:(?<!\\\\),|$):匹配任何内容并将其分组,直到,前面没有\或行尾。