PHP preg_split所需的正则表达式


Regular expression needed for PHP preg_split

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

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

所以我有两个分隔符,其中=是键和值的集合。问题是key和value可以包含相同的符号和=,但它们总是会被转义。所以我不能用explosion。我需要使用preg_split,但我不擅长正则表达式。

谁能帮我一下这个?

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

查看效果

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

解释:

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