我正在研究解析來自API的數據的JavaScript程序。部分數據以「\ t」格式返回,我需要將它解析爲tab(在本例中)不是'\ t'。PHP的stripcslashes相當於
在PHP中,有一個很棒的函數叫做stripcslashes(),它爲我做了這個,但是我找不到一個與JavaScript相同的函數。
有人知道JavaScript中有這樣的功能嗎?或者作爲一個標籤解析'\ t'的方式?
我正在研究解析來自API的數據的JavaScript程序。部分數據以「\ t」格式返回,我需要將它解析爲tab(在本例中)不是'\ t'。PHP的stripcslashes相當於
在PHP中,有一個很棒的函數叫做stripcslashes(),它爲我做了這個,但是我找不到一個與JavaScript相同的函數。
有人知道JavaScript中有這樣的功能嗎?或者作爲一個標籤解析'\ t'的方式?
JavaScript的字符串文字使用那些相同的反斜槓。應該有一種方法,利用該...
var escapedString = '\\t' // actually contains "\t"
, renderedString = (new Function('return "' + text + '"'))()
;
console.log(renderedString); // " " <= this is the tab character
注意,這讓你的代碼,開闊了注入攻擊,並且是非常不安全,特別是如果escapedString
從外部源!
它幾乎和using eval一樣糟!
更新:
一種更好的方式可能會被使用正則表達式的安全方法:
var escapedString = '\\t' // actually contains the characters \ and t
, renderedString = escapedString.replace(/\\(.)/g, function (match, char) {
return {'t': '\t', 'r': '\r', 'n': '\n', '0': '\0'}[char] || match;
}
;
console.log(renderedString); // " " <= this is the tab character
在這裏你會使用replace方法來跟蹤所有的反斜槓(跟隨通過任何字符),並在每次找到匹配時調用匿名函數。該函數的返回值將決定哪些匹配將被替換。
匿名函數包含一個JS對象(在這種情況下用作關聯數組),其中包含所有識別的轉義字符。反斜槓後面的字符(這裏稱爲char
)將在該關聯數組中查找,JS將返回相應的值。
該行的最後一部分|| char
確保如果char
不是關聯數組的一部分,則會使用未更改的匹配項(其中包含反斜槓),從而保持原始字符串不變。
當然,這意味着您必須提前指定所有可能的轉義。
二更新:去
它只是發生,我認爲第一種方法是不安全的(有可能是欺詐性的輸入),第二種方法不確定性(你真的不知道是什麼逃脫的方法你需要提供);也許兩種方法都可以結合起來!
var escapedString = '\\t' // actually contains the characters \ and t
, renderedString = escapedString.replace(/\\./g, function (match) {
return (new Function('return "' + match + '"'))() || match;
}
;
console.log(renderedString); // " " <= this is the tab character
當然,這個解決方案的性能不會很好。解析和構建這個新函數是一件昂貴的事情,並且需要爲轉義字符串中存在的每個匹配反斜槓完成。如果性能成爲問題,您可以添加某種緩存機制,一旦創建它就會記住每個函數。
然後,您還可以查找需要使用的API,嘗試查找其文檔或與其製造商聯繫,並獲得可生成的轉義列表的明確列表。 :-0
我試圖避免使用該正則表達式解決方案,因爲我必須提供該列表。嘿,嘿。謝謝 – RiggerTheGeek 2013-02-14 16:37:34
@RiggerTheGeek:另外,請記住,我不知道Javascript是否逃脫*完全相同的集*作爲C(或任何您的API使用) – Martijn 2013-02-14 16:49:00
我會在早上測試API(寫在Java中,輸出爲JSON的記錄),並接受它,一旦我得到它的工作 – RiggerTheGeek 2013-02-14 21:55:59
如果你使用jQuery,html()和text()函數應該做你想做的。
var parsed = $("<div/>").html('\thello').text();
不是我正在尋找的東西。我沒有使用jQuery(不是我的選擇),但我們已經將'\ t'解析爲製表符。我正在從API獲取\ t,它等於 'var delimiter ='\\ t';' – RiggerTheGeek 2013-02-14 16:05:57
'replace(/ [\ s \\] +/g,'')'會做詭計嗎? – alexbusu 2013-02-14 15:53:45
它沒有。這只是將斜槓去掉 - 我想解析\ t作爲製表符 – RiggerTheGeek 2013-02-14 15:57:53
'replace(/([\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' :) – alexbusu 2013-02-14 16:20:52