2013-08-26 58 views
2

我有一个字符串(JSON数据的一部分),并希望解析它在括号[...]。这里是例如:preg_replace剪辑字符串中的字符

例如 [-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代码工作良好,但问题是:当它找到','并添加'],['字符而不是它,删除了一些数字的坐标。您可以通过在坐标后添加值来检查它。例如-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

我会倾向于在逗号上爆炸,然后循环 – 2013-08-26 21:06:44

+0

有时候可能有负坐标,所以在这种情况下,第一个字母是' - '例如:-0.5937 – mete7

回答

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; 

?> 

这将取代所有其他逗号。

+0

这使得更清晰,但现在它删除了一些第一个数字和' - '负字符。示例坐标:[-0.5937123456789,2.0734123456789,-0.1577123456789,1.7941123456789,1.2048123456789,1.5296123456789] – mete7

+0

@ mete7固定。我认为我们是匹配空白而不是非空白。必须仔细检查。 –

+0

感谢卢克,但我得到了一个错误:解析错误:语法错误,意外T_FUNCTION – mete7

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) 
) 
~ 
+0

谢谢,这真的很感激。我必须在PHP正则表达式上努力工作...... – mete7