使用 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
之前的字符类跳过结构字符,而第二个 […]
只找到除逗号和括号之外的任何字符 - 然后用引号括起来。
我有这个数组:
$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
之前的字符类跳过结构字符,而第二个 […]
只找到除逗号和括号之外的任何字符 - 然后用引号括起来。