解析此字符串并从中创建数组的最佳方法


Best way to parse this string and create an array from it

我有以下字符串:

{item1:test},{item2:hi},{another:please work}

我想做的是把它变成一个像这样的数组:

[item1] => test
[item2] => hi
[another] => please work

以下是我目前正在使用的代码(有效):

$vf = '{item1:test},{item2:hi},{another:please work}';
$vf = ltrim($vf, '{');
$vf = rtrim($vf, '}');
$vf = explode('},{', $vf);
foreach ($vf as $vk => $vv)
{
    $ve = explode(':', $vv);
    $vx[$ve[0]] = $ve[1];
}

我担心的是;如果值中有冒号怎么办?例如,假设item1的值为you:break。那个冒号会让我完全失去break。如果值中有冒号,有什么更好的编码方法?

为什么不对爆炸函数设置限制。像这样:

$ve = explode(':', $vv, 2);

这样,字符串将只在第一次出现冒号时拆分。

为了解决值嵌入冒号的可能性,并且为了讨论(不一定是性能):

$ve = explode(':', $vv);
$key = array_shift($ve);
$vx[$key] = implode(':', $ve);

获取数组的第一个元素,假设索引中没有冒号。然后用冒号重新连接数组的其余部分。

不要对所有内容都使用effing explode

使用一个琐碎的键:value regex,可以更可靠地提取这种简单的格式。特别是因为它们周围有整齐的分隔符。

而且它的代码要少得多:

preg_match_all('/{('w+):([^}]+)}/', $vf, $match);
$array = array_combine($match[1], $match[2]);

'w+只匹配一个字母数字字符串,而[^}]+则匹配任何直到结束的}array_combine更容易将其转换为key=>值数组。

回答您的第二个问题:

如果您的格式与特定内容冲突,那就很糟糕。我认为有两种类型可以解决。

  1. 转义分隔符:也就是说,每个冒号和大括号都必须转义,这很奇怪,所以数据用例如"来分隔,并且只有那些引号是转义的(在这种情况下是JSON)
  2. 节省数据长度:这是PHP序列化数组的方式。在该数据结构中,您说下一个n字符是一个令牌

第一种类型很容易读取和操作,尽管必须读取整个文件才能随机访问它。如果结构不节省字符数量(因为在UTF-8中,不能通过不读取n字符来跳过它们),但可以节省要跳过的字节数量,那么第二种类型将非常适合更好的随机访问。PHP的序列化函数生成n == strlen($token),因此我不知道与JSON相比有什么优势。

在可能的情况下,我尝试使用JSON在不同的系统之间进行通信。