2

我正在开发一个从 API 解析数据的 JavaScript 程序。部分数据以“\t”等格式返回,我需要将其解析为制表符(在本例中)而不是“\t”。

在 PHP 中,有一个很棒的函数叫做stripcslashes()可以为我做这件事,但我找不到 JavaScript 的等价物。

有人知道 JavaScript 中有这样的函数吗?还是一种将 '\t' 解析为制表符的方法?

4

2 回答 2

2

Javascript 的字符串文字使用相同的反斜杠转义。应该有办法利用它...

var escapedString = '\\t' // actually contains "\t"
,   renderedString = (new Function('return "' + text + '"'))()
;
console.log(renderedString); // "   " <= this is the tab character

请注意,这会使您的代码对注入攻击敞开大门,并且非常不安全,特别是如果escapedString来自外部源!

它(几乎)和使用 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

于 2013-02-14T16:20:43.067 回答
0

如果您使用的是 jQuery,那么 html() 和 text() 函数应该可以满足您的需求。

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

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

于 2013-02-14T16:00:59.600 回答