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

もちろん、これは可能なすべてのエスケープを事前に指定する必要があることを意味します。

2 番目の更新: 進むべき道

最初の方法は安全ではなく (不正な入力がある可能性があります)、2 番目の方法は不確実です (どのエスケープを提供する必要があるか本当にわかりません)。おそらく、両方の方法を組み合わせることができます。

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 に答える