我有一个字符串(JSON数据的一部分),并希望用括号[...]解析它。这是一个例子:
例如 [-0.5937,2.0734,-0.1577,1.7910,0.2048,1.5296]>>> [ - 0.5937,2.0734],[ - 0.1577,1.7941],[0.2048,1.5296]
我写这个PHP代码很好但问题是:当它找到','并添加'],['字符而不是它,删除坐标的一些数字。您可以通过在坐标后添加 123456789 值来检查它。例如 -0.5937 => -0.5937123456789 那我怎么能避免删除坐标数字???
示例代码
<?php
$line = '[-0.5937, 2.0734,-0.1577, 1.7941,0.2048, 1.5296]';
$brackets = preg_replace('/\d,\S/', '], [', $line);
echo $brackets;
?>
答案 0 :(得分:0)
您可以使用assertion执行此操作,以防止模式捕获数字和非空白字符。像这样:
'/(?<=\d),(?<=\S)/'
或者,您可以将模式更改为:
'/,(?<=\S)/'
忽略数字字符。
然而,我建议您做的事情会使您的代码不依赖于数字前的空格。使用preg_replace_callback:
<?php
$line = '[-0.5937, 2.0734,-0.1577, 1.7941,0.2048, 1.5296]';
$i = 0;
function everyOther($matches) {
$i++;
if ($i % 2 == 1)
return ',';
else
return '], [';
}
$brackets = preg_replace_callback(
'/,/',
'everyOther',
$line);
echo $brackets;
?>
这将取代所有其他逗号。
答案 1 :(得分:0)
你可以这样做:
$string = '[-0.5937, 2.0734,-0.1577, 1.7941,0.2048, 1.5296]';
$pattern = '~[[,]\s*(-?\d++(?>\.\d++)?)\s*,\s*(-?\d++(?>\.\d++)?)\s*(?:]|(?=(,)))~';
$result = preg_replace($pattern, '[$1, $2]$3 ', $string);
模式细节:
~ # pattern delimiter
[[,] # a [ or a ,
\s* # optional spaces
(-?\d++(?>\.\d++)?) # a number (group 1)
\s*,\s* # ,
(-?\d++(?>\.\d++)?) # (group 2)
\s*
(?: # non capturing group
] # literal ]
| # OR
(?=(,)) # a lookahead that capture the comma (group 3)
)
~