使用replaceList函数的意外行为

时间:2016-06-13 20:03:17

标签: coldfusion

我们最近从CF 10转到CF 2016,偶然发现了以下问题:

<cfscript>

    x = "abc";
    x = replaceList(x, "ab|cd", "1|2", "|");
    writeDump(x);

    // CF 11, CF 2016
    // >> 12

    // CF 10, Railo/Lucee
    // >> 1c

    // --------------------

    x = "abc";
    x = replaceList(x, "ab,cd", "1,2", ",");
    writeDump(x);

    // CF 11, CF 2016
    // >> 1c

    // CF 10, Railo/Lucee
    // >> 1c

</cfscript>

这里发生了什么?为什么Adobe会对此进行更改not documented?它甚至是一个有意改变的开始吗?

更新:

提交给Adobe的

Bug Report #4164200

1 个答案:

答案 0 :(得分:2)

简答:

我怀疑这是无意的,并会提交错误报告。作为解决方法,请尝试转义管道符号:replaceList(x, "ab|cd", "1|2", "\|");

更长的回答:

在内部,此函数几乎肯定会使用某种正则表达式(其中管道符号|具有特殊含义,即逻辑OR)。我的猜测是CF首先使用String.split("regex")将两个列表分成数组。然后循环遍历数组以执行替换。

根据结果,CF不会转义管道符号,导致列表的拆分方式与预期不同。每个单独的角色都会成为一个单独的元素,显然最终会比你想要的更多匹配,即基本字符串中的每个字符。

list = "ab|cd";
writeDump(list.split("|") );

Results of split("|")

但是,如果使用\转义管道符号,则会得到预期的结果:

list = "ab|cd";
writeDump(list.split("\|"));

Results of split("\|")