2013-02-14 72 views
2

我正在研究解析來自API的數據的JavaScript程序。部分數據以「\ t」格式返回,我需要將它解析爲tab(在本例中)不是'\ t'。PHP的stripcslashes相當於

在PHP中,有一個很棒的函數叫做stripcslashes(),它爲我做了這個,但是我找不到一個與JavaScript相同的函數。

有人知道JavaScript中有這樣的功能嗎?或者作爲一個標籤解析'\ t'的方式?

+1

'replace(/ [\ s \\] +/g,'')'會做詭計嗎? – alexbusu 2013-02-14 15:53:45

+0

它沒有。這只是將斜槓去掉 - 我想解析\ t作爲製表符 – RiggerTheGeek 2013-02-14 15:57:53

+0

'replace(/([\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' :) – alexbusu 2013-02-14 16:20:52

回答

2

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

+0

我試圖避免使用該正則表達式解決方案,因爲我必須提供該列表。嘿,嘿。謝謝 – RiggerTheGeek 2013-02-14 16:37:34

+0

@RiggerTheGeek:另外,請記住,我不知道Javascript是否逃脫*完全相同的集*作爲C(或任何您的API使用) – Martijn 2013-02-14 16:49:00

+0

我會在早上測試API(寫在Java中,輸出爲JSON的記錄),並接受它,一旦我得到它的工作 – RiggerTheGeek 2013-02-14 21:55:59

0

如果你使用jQuery,html()和text()函數應該做你想做的。

var parsed = $("<div/>").html('\thello').text(); 

http://api.jquery.com/html/
http://api.jquery.com/text/

+0

不是我正在尋找的東西。我沒有使用jQuery(不是我的選擇),但我們已經將'\ t'解析爲製表符。我正在從API獲取\ t,它等於 'var delimiter ='\\ t';' – RiggerTheGeek 2013-02-14 16:05:57