使用 preg_replace 将引号添加到数组

Using preg_replace to add quotes to array

我有这个数组:

$array = '[[Smarties, 50g, 3, 1.99], 
          [M&Ms Peanut, 49g, 3, 1.99], 
          [Oreo Cookies, 300g, 1, 3.99], 
          [Pepsi, 355ml, 3, 1.29]]';

我需要使用 json_decode,所以我需要找到一种方法将里面的信息用引号括起来,如下所示:

[["Smarties", "50g", "3", "1.99"], 
["M&Ms Peanut", "49g", "3", "1"."99"], 
["Oreo Cookies", "300g", "1", "3.99"], 
["Pepsi", "355ml", "3", "1.29"]]

我尝试使用 preg_replace,这就是我目前得到的结果(接近,但它将价格分成两部分,并将两个单词的名称分成两部分。):

[["Smarties", "50g", "3", "1"."99"], 
["M"&"Ms" "Peanut", "49g", "3", "1"."99"], 
["Oreo" "Cookies", "300g", "1", "3"."99"], 
["Pepsi", "355ml", "3", "1"."29"]]

我真的很难理解 preg_replace,我希望有人能提供帮助。

有没有办法使用分隔逗号作为指南来确定引号的放置位置?

处理这个字符串,比如

$sample = explode('],', $array);

foreach ($sample as &$v)
{
    $v = array_map('trim', explode(',', trim($v, '[ ]')));
}

现在,数组变成了,

array (
  0 => 
  array (
    0 => 'Smarties',
    1 => '50g',
    2 => '3',
    3 => '1.99',
  ),
  1 => 
  array (
    0 => 'M&Ms Peanut',
    1 => '49g',
    2 => '3',
    3 => '1.99',
  ),
  2 => 
  array (
    0 => 'Oreo Cookies',
    1 => '300g',
    2 => '1',
    3 => '3.99',
  ),
  3 => 
  array (
    0 => 'Pepsi',
    1 => '355ml',
    2 => '3',
    3 => '1.29',
  ),
)

简单地说,json_encode()会给,

string '[["Smarties","50g","3","1.99"],["M&Ms Peanut","49g","3","1.99"],["Oreo Cookies","300g","1","3.99"],["Pepsi","355ml","3","1.29"]]' (length=128)

一个不是最优的,但可行的例子:

$result = json_decode(strtr(strtr($yourString, array('['=>'["', ']'=>'"]', ', '=>'","', ']","['=>'],[')), array(']","[' => '],[', '["[' => '[[', ']"]' => ']]')), true);

对于一种有点粗糙但上下文感知的正则表达式,可以使用:

$str = preg_replace("~ [\[\],\s]*\K [^,\[\]]+ ~x", '"[=10=]"', $str);
                           ↑             ↑
                        skip ][,    capture non-
                        + space   commas/brackets

\K 之前的字符类跳过结构字符,而第二个 […] 只找到除逗号和括号之外的任何字符 - 然后用引号括起来。