2013-08-26 127 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