1

假设我有:

<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"}]

addItemeditItemdeleteItem周围没有双引号。

编辑 2012-07-13 为什么我需要这个?我创建了一个 CFML 函数,其结果是一个 JS 集合,将在许多文件中使用。jsButton 对象将用作 JS 库中可用选项的一部分。该函数的参数之一是一个结构数组(默认为 arrButtons),并且提供的参数值可以与默认值合并。

由于我们不能(在 CFML 中)在没有双引号的情况下写入onpress值,所以我必须为该值添加双引号,并将结构的(CFML)数组转换为 JSON(这只是一个字符串)并删除双引号在将其放入 JS 库选项之前。

使用 Railo,我们可以将结构声明为链接结构,以确保循环或转换具有相同的有序键(从上面的示例中, onpress始终是结构中的最新键)。有了这个链接结构和相同的键顺序,我们可以用简单的替换函数删除双引号,但当然我们不能保证每个使用 CFML 函数的程序员都不会忘记使用链接结构和键顺序与上面的示例相同

4

3 回答 3

1

你想要输出的不是 JSON,所以使用 SerializeJSON 是一个杂项。

您是否有任何理由首先将其放入 ColdFusion 数组中,而不是直接编写 Javascript?

JSON 纯粹是一种数据描述语言。根据 http://www.json.org,它是一种“轻量级数据交换格式”。- 不是编程语言。

根据http://en.wikipedia.org/wiki/JSON,支持的“基本类型”是:

  • 数字(整数、实数或浮点数)
  • 字符串(带反斜杠转义的双引号 Unicode)
  • 布尔值(真假)
  • 数组(值的有序序列,以逗号分隔并括在方括号中)
  • 对象(键:值对的集合,以逗号分隔并用大括号括起来)
  • null

--来源

于 2012-07-12T21:01:47.247 回答
1

我不确定这是否真的必要 - 根据您处理 JS 回调的方式/位置,可能可以使用字符串函数名称来引用函数,而无需删除引号(即object[button.onpress])。

但是,既然你问了,这里是一个正则表达式解决方案:

jsButtons  = jsButtons.replaceAll('(?<="onpress":)"([^"]+)"','$1');


那里的正则表达式由两部分组成:

(?<="onpress":)-- 向后看以确保我们正在处理文本"onpress":
"([^"]+)" -- 匹配引号并捕获它们的内容。

替换方面是用第$1一个捕获组(即引号的内容)替换匹配的文本(即整个引用的值)。

如果“onpress”的大小写敏感可能是一个问题,您可以在正则表达式前面加上(?i)忽略大小写。

如果会有多个不同的事件(不仅仅是“onpress”),您可以将上面表达式的相关部分更新为(?<="on(?:press|hover|squeek)":)等。


注意:以上所有内容都依赖于serializeJson不改变的格式输出-如果将来可能存在注释、空格、单引号或其他任何内容,则需要更长的表达式来满足这些要求-这就是原因的一部分您应该首先调查是否需要正则表达式来解决此问题。

于 2012-07-12T15:40:34.550 回答
0

我想在这种情况下你可以简单地使用 serialize()。这应该够了吧...

格特

于 2012-07-12T08:14:50.657 回答