2016-06-13 24 views
3

我們最近提出從CF 10到CF 2016年偶然發現了以下問題:與replaceList功能意外行爲

<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?這是否意味着改變?

更新:

Bug Report #4164200申請與Adobe

回答

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("\|")

+0

感謝您的見解。我沒有想過正則表達式。我報告了它:https://bugbase.adobe.com/index.cfm?event=bug&id=4164200 – Alex

+0

不客氣。我認爲靈活性不一定是壞事,但是......即使這是他們的意圖,他們至少應該提到文檔中的行爲;-) – Leigh