思路: 逐个匹配,逐个替换 //效率上, 有待确认,提高 方式: php替换函数, 正则表达式 $test = '{"":{"test":""}, "":{"test":""}, "":"test"}'; //字符串替换 只好使用正则进行匹配
$test = str_replace("\"\":{", "\"_empty_\":{", $test, $count); //这里可使用单引号: $test = str_replace('"":{', '"_empty_":{', $test, $count); for($i=1; $i<=$count; $i++){ $test = preg_replace("/_empty_/", "_empty$i", $test, 1); //$test = preg_replace('/_empty_/', "_empty$i", $test, 1); }
var_dump($test); $test = json_decode($test, 1); var_dump($test); exit; code: /**
* iniJson字段串替换
* 这里可以将 _empty_ 提取到方法参数位置,从而实现替换字符串的自定义,这里暂时不改
*/
public function jsonReplace($json){
$json = str_replace('"":{', '"_empty_":{', $json, $count);
for($i=1; $i<=$count; $i++){
$json = preg_replace('/_empyt_/', '_empty'.$i, $json, 1);
}
return $json;
} //功能升级, 这里并没有使用正则去做替换,因为个人认为php内置函数性能方面还是要优于正则匹配,除非功能上无法实现,建议还是不要使用正则/ class Device_fit_tool extends Model { protected $tableName = 'device_fit_tool'; protected $searchStr = ['"":{', '"" :{', '"" : {', '"": {']; protected $tmpReplaceStr = '__empty__'; protected $finalReplaceStr = '__empty_'; public $data = ''; public $data1 = ''; public function __construct() { $filePath = 'D:\\iniJson.json'; $filePath1 = 'D:\\iniJsonToMiddleJson.json'; if (file_exists($filePath)) { $this->data = file_get_contents($filePath); } if (file_exists($filePath1)) { $this->data1 = file_get_contents($filePath1); } } public function jsonEmptyKeyReplace($json){//iniJson字段串替换空字符串key,避免转换为数组时被覆盖 //方式一 可以看到,str_replace()函数可以的查找字符串可以为数组形式,替换参数认为字符串, //更多用法见:php参考手:php手册->函数参考->文本处理->字符串->字符串函数->str_replace; $json = str_replace($this->searchStr, "\"$this->tmpReplaceStr\":{", $json, $count); // //方式二 // $sum = 0; // foreach($this->searchStr as $pattern){ // $json = str_replace($pattern, "\"$this->tmpReplaceStr\":{", $json, $count); // $sum += $count; // } for($i=1; $i<=$count; $i++){ $json = preg_replace("/$this->tmpReplaceStr/", ($this->finalReplaceStr).$i, $json, 1); } return [$json, $count]; } } 处理结果如下: 处理前: 处理后: |