所以我有一个input[type="text"]
,我想将JSON对象粘贴为配置。控制台中的输出是完美的,所有内联都没有任何修剪,但现在在input
我有很多间距。我想摆脱这个间距并替换input
值。
示例
$('#widget-json').on('input propertychange', function () {
var string = this.value.replace(/\s+/g, ''),
data = $.parseJSON( string );
$(this).val( string );
});
几乎完成了这项工作,但它也删除了引号内的间距。因此,如果我有"sentence": "Sure thing, good to go."
之类的键/值,那么它将被转换为"sentence":"Surething,goodtogo."
,而我想要保留引号内的间距。
JSON对象示例
{
"widget-effect": 3,
"widget-opacity-color": "#C7C9CF",
"widget-opacity-slider": "50%",
"widget-opt-close": false,
"widget-opt-scroll": true,
"widget-opt-totop": true,
"widget-text": "Spacing required within quotes"
}
所需的输出示例
{"widget-effect":3,"widget-opacity-color":"#C7C9CF","widget-opacity-slider":"50%","widget-opt-close":false,"widget-opt-scroll":true,"widget-opt-totop":true,"widget-text": "Spacing required within quotes"}
jQuery.trim( this.value )
但根本没用。this.value.replace(/\s+/g, '')
并删除了整个空格,即使在引号内也是如此。我知道这可能是正确的结果,但我不知道如何仅在引号之外删除它。我假设可以使用正则表达式来跳过替换引号内部的间距,但我根本不熟悉它。
答案 0 :(得分:11)
使用正则表达式交替运算符。
var s = '"sentence": "Sure thing, good to go."';
alert(s.replace(/("[^"]*")|\s/g, "$1"))
上面的正则表达式实际上是什么?
("[^"]*")
捕获所有双引号块。因此,在上文中,"sentence"
和"Sure thing ..."
被捕获(意味着此特定部分将存储到索引1的临时缓冲区中)。
|
或
\s
匹配剩余字符串中的所有空格字符。因此它不会触及之前匹配的部分。
$1
指的是第一个捕获组捕获的所有字符。因此保留了第一个捕获组中的字符,并删除了匹配的空格。
答案 1 :(得分:2)
尝试使用JSON.stringify
$("#widget-json").on("input propertychange", function () {
// var string = this.value.replace(/\s+/g, ''),
var data = JSON.stringify($.parseJSON( this.value ));
$(this).val( data );
});
var data = {
"widget-effect": 3,
"widget-opacity-color": "#C7C9CF",
"widget-opacity-slider": "50%",
"widget-opt-close": false,
"widget-opt-scroll": true,
"widget-opt-totop": true,
"widget-text": "Spacing required within quotes"
};
document.write(JSON.stringify(data));