2011-08-11 70 views
0

我已經打在這一個我的頭,並不能找出一個正則表達式來實現以下目標:使用PHP的preg_replace解析出JSON字符串目標雙引號

輸入字符串(這是JSON數據通過許多其他JSON的)所包圍:

$string=..."natural_order":"12"... 

其中12也可以是如「1.2」小數,也可以是像1288或1.288大。

所需的字符串:

..."natural_order":12... 

使用PHP的preg_replace,到目前爲止,我已經得到了:

preg_replace('/[^natural_order:]+"/', '', $string); 

但只返回:

"12" 

任何想法是極大的讚賞!

+0

'preg_replace'是修改目標字符串。提取一些你需要'preg_match'的東西。 http://stackoverflow.com/questions/5762739/how-can-i-parse-this-json-data/5762810#5762810 – mario

回答

0

我可以想到兩個解決方案。首先,我不打擾寫出來,將使用json_decode解碼JSON,通過將它們解析爲整數,並重新編碼字符串來更正值。

其次是繼續你的路徑。但是,JSON是一個相當複雜的字符串,並且不能使用正則表達式可靠地解析。如果你有信心,圖案"natural_order":"value"不會出現在其他地方,你可以試試這個:

$result = preg_replace('/"natural_order"\s*\:\s*"([-+]?[0-9]*\.?[0-9]+)"/', '"natural_order":$1', $string); 

這應該與任何封裝的關鍵,後跟一個冒號,然後封裝有效的浮點數。如果冒號附近有空格,也有逃脫。

+0

我更新了我的例子。我有一個額外的'\'隱藏在替換字符串中。 – OverZealous

2

相反棘手使用regexen的,我建議的東西沿着這些路線:

$array = json_decode($string, true); 
array_walk_recursive($array, function (&$value, $key) { 
    if ($key == 'natural_order') { 
     $value = strpos($value, '.') ? (float)$value : (int)$value; 
    } 
}); 
$string = json_encode($array); 
+0

是的,這是我不想寫出來的東西... ;-) – OverZealous

+0

@Over我認爲寫出來要比試圖介意彎曲正確的正則表達式要快;; – deceze

+0

值得注意的是,匿名函數(AKA關閉)需要PHP 5.3或更新版本。但是可以使用舊式回調來重寫。 – OverZealous