2

我有一个字符串(JSON 数据的一部分)并想在括号中解析它 [...]。这是示例:

例如 [-0.5937, 2.0734,-0.1577, 1.7941,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;

?>
4

2 回答 2

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)
)
~
于 2013-08-26T21:20:32.033 回答
0

您可以使用断言来执行此操作,以防止模式捕获数字和非空白字符。像这样:

'/(?<=\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;

?>

这将替换所有其他逗号。

于 2013-08-26T21:06:34.177 回答