preg_replace在字符串中剪辑字符

时间:2013-08-26 21:02:04

标签: php preg-replace

我有一个字符串(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;

?>

2 个答案:

答案 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)
)
~