让我说我有:
<cfscript>
arrButtons = [
{
"name" = "Add",
"bclass" = "add",
"onpress" = "addItem"
},
{
"name" = "Edit",
"bclass" = "edit",
"onpress" = "editItem"
},
{
"name" = "Delete",
"bclass" = "delete",
"onpress" = "deleteItem"
}
];
jsButtons = SerializeJSON(arrButtons);
// result :
// [{"onpress":"addItem","name":"Add","bclass":"add"},{"onpress":"editItem","name":"Edit","bclass":"edit"},{"onpress":"deleteItem","name":"Delete","bclass":"delete"}]
</cfscript>
对于每个onpress
项,我需要从其值中删除双引号以匹配JS库要求(onpress值必须是回调函数)。
如何使用正则表达式删除双引号?
最终结果必须是:
[{"onpress":addItem,"name":"Add","bclass":"add"},{"onpress":editItem,"name":"Edit","bclass":"edit"},{"onpress":deleteItem,"name":"Delete","bclass":"delete"}]
围绕 addItem , editItem 和 deleteItem 没有双引号。
修改2012-07-13 为什么我需要这个?我创建了一个CFML函数,结果是JS的集合,将在许多文件中使用。 jsButton对象将用作JS库中可用选项的一部分。该函数的一个参数是一个struct数组(默认为arrButtons),提供的参数值可以与默认值合并。
由于我们不能(在CFML中)编写没有双引号的 onpress 值,所以我必须为该值添加双引号,并将struct的(CFML)数组转换为JSON(其中只是一个字符串)并在将它放入JS库选项之前删除双引号。
使用Railo,我们可以将结构声明为链接结构,以确保我们具有相同的循环或转换顺序键(从上面的示例 onpress 始终是结构中的最新键)。使用这个链接的结构和相同的键顺序,我们可以使用简单的Replace函数删除双引号,但当然我们不能保证每个使用CFML函数的程序员都不会忘记使用与上面的示例相同的链接结构和键顺序
答案 0 :(得分:1)
我不确定这实际上是否必要 - 取决于您处理JS回调的方式/位置,可能使用字符串函数名来引用该函数而无需删除引号(即{ {1}})。
但是,既然你问,这是一个正则表达式解决方案:
object[button.onpress]
正则表达式由两部分组成:
jsButtons = jsButtons.replaceAll('(?<="onpress":)"([^"]+)"','$1');
- 向后看以确保我们正在处理文本(?<="onpress":)
"onpress":
- 匹配引号并捕获其内容。
替换方的"([^"]+)"
是用第一个捕获组(即引号的内容)替换匹配的文本(即整个引用的值)。
如果“onpress”的区分大小写可能是一个问题,您可以在正则结构前加$1
来忽略大小写。
如果会有多个不同的事件(不只是“onpress”),您可以将上面表达式的相关部分更新为(?i)
等。
注意:以上所有内容都依赖于(?<="on(?:press|hover|squeek)":)
的格式输出没有变化 - 如果将来可能会有评论,空白,单引号或其他任何内容,那么更长的表达式会需要满足那些 - 这是你应该调查的一部分,如果你甚至需要正则表达式来解决这个问题。
答案 1 :(得分:1)
您想要输出的不是JSON,因此使用SerializeJSON是一个kludge。
您是否有任何理由首先将其放入ColdFusion数组中,而不是直接编写Javascript?
JSON纯粹是一种数据描述语言。每 http://www.json.org,它是一种“轻量级数据交换格式”。 - 不是编程语言。
每http://en.wikipedia.org/wiki/JSON,支持“基本类型” 是:
- 数字(整数,实数或浮点数)
- String(带反斜杠转义的双引号Unicode)
- 布尔值(true和false)
- 数组(有序的值序列,逗号分隔并用方括号括起来)
- 对象(键的集合:值对,以逗号分隔并用花括号括起来)
null
- Source
答案 2 :(得分:0)
我想在这种情况下你可以简单地使用serialize()。那应该是诀窍......
格特