【发布时间】:2015-05-04 02:19:29
【问题描述】:
所以我将提供这个简单的 json 字符串示例,涵盖了我的大部分实际字符串情况:
"time":1430702635,\"id\":\"45.33\",\"state\":2,"stamp":14.30702635,
我正在尝试对字符串中的数字进行预替换,将它们括在引号中,除了索引已经被引用的数字,就像在我的字符串中一样 - '\state\':2 到目前为止,我的正则表达式是
preg_replace('/(?!(\\\"))(\:)([0-9\.]+)(\,)/', '$2"$3"$4',$string);
在这种情况下,我想要获得的 rezulting 字符串是“\state\”值未加引号,被正则表达式跳过,因为它包含 :digit 前面的 \",
"time":"1430702635",\"id\":\"45.33\",\"state\":2,"stamp":"14.30702635",
为什么 '\state\' 数字也被替换了?
也试过https://regex101.com/r/xI1zI4/1 ..
新编辑:
所以根据我的尝试,
(?!\\")
不工作!!
如果我被允许,我会不回答这个问题,以防其他人知道原因。
我的解决方案是使用这个正则表达式,而不是 NOT,我选择了是 ..
$string2 = preg_replace('/(\w":)([0-9\.]+)(,)/', '$1"$2"$3',$string);
谢谢。
【问题讨论】:
-
你不能先解码然后将所有元素转换为字符串,然后再重新编码
-
不,因为我会丢失大整数stackoverflow.com/questions/8663298/…
-
这是您当前情况的解决方案,但我认为这可以做得更好...
preg_replace('~(("time":)([0-9.]+),|("stamp":)([0-9.]+),)~', '$2$4"$3$5",',$string); -
@chris85 我的字符串只是一个例子,我的实际字符串大约有 100kb 长,不能用文字覆盖所有内容..我想我应该重新表述我的问题..
-
所有应该有引号的数字是否一致?大于 5 位小数,以 143 开头等?