Here is a regex which works on float numbers, and it works for attributes, but also arrays. It also works for negative floats.
preg_replace('/((?<=":)|(?<=\[)|(?<=,))(?<!")(-?\d+\.\d+)(?!")/', '"$2"', $json)
If you also want to cover for scientific notations, this will work but this will also convert integers to strings
preg_replace('/((?<=":)|(?<=\[)|(?<=,))(?<!")(-?[\d\.]+((e|E)(\+|-)\d+)?)(?!")/', '"$2"', $json)
The inspiration was taken from this answer, i've adjusted the regex to be even able to use replace, and expanded it to work with arrays and negatives https://stackoverflow.com/a/35008486
Tested with string
{"array":[[0.00004639,683724.2687321],[0.00004658,190091.61007863,190091.61007863]],"and_finally":{"negative_float":-1.123,"negative_int":-1,"first_name":"sa123mp5e-19le","last_name":"la5.1e+5stn543.123,ame","integer":"100","another_float":"1555.20","int":100,"float":1555.20,"floatAsString":"1555.20","date":"2015-01-01 15:23:51","somefloat":[14,23],"somefloat2":[5e-7,23.33],"scientific_negative_float":5.2e-7,"scientific_positive_float":5E+19}}
Issues
This will fail if there is whitespace in the json (which in production environment is never the case). If you have whitespace then you could just remove all whitespace with this (but if you have sentences anywhere in the json, this will merge it into a single long word)
preg_replace('/\s/', '', $json)
Another issue with this approach is that the array matches are not safe if they are found within a string. These will be rare, but they still might happen.
This will fail {"last_name":"lastn,543.123ame"}
This will also fail
{"last_name":"lastn[543.123ame"}
Unfortunately there is no straightforward way of getting around these limitations using only one regex pass. However, if you have a response that contains purely numbers, then this works like a charm!