0

私は本質的に怠惰なコーダーなので、書く前に次のことを行うlibがあることを知りたいと思います。

var parser = PathParser('/{first}/{last}');
var actual = parser.parse('/fred/flintstone');
assertEquals({"first":"fred","last":"flintstone"}, actual);

最初の文字列はパターンを指定し、2番目の文字列は関連する値を抽出して、パターン内のキーに対応するキーを持つオブジェクトにそれらを格納します。

拡張を行う標準を見つけましたが、JSONオブジェクトの生成は行いません。

4

1 に答える 1

1

最初の文字列からキーの配列を抽出し、後者から値の配列を抽出する必要があります。値の前に特定のパターンがあり、その後に特定のパターンがあります。

これを行う既存のライブラリはありませんが、実装を作成しました。ここでライブデモンストレーションを見つけることができます。

//## Extension to escape all regex special characters in a string ##

RegExp.quote = function(str) {
    return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};


//## Parsing ##

var parser = PathParser('/{first}/{last}');
var actual = parser('/fred/flintstone');


//## Output ##

var pre = document.createElement('pre');
pre.innerHTML = JSON.stringify(actual, null, "  ");
document.body.appendChild(pre);    


//## The parser constructor ##

function PathParser(pattern) {
    var keys = [];
    var keyreg = /\{([a-zA-Z0-9]+)\}/g;
    var result;
    while ((result = keyreg.exec(pattern)) !== null) {
        var pre = "^" + RegExp.quote(pattern.substring(0, result.index)).replace(/\\\{[a-zA-Z0-9]+\\\}/g, ".*");
        var post = RegExp.quote(pattern.substring(keyreg.lastIndex)).replace(/\\\{[a-zA-Z0-9]+\\\}/g, ".*") + "$";
        keys.push({
            pre: pre,
            post: post,
            text: result[1]
        });
    }

    function parser(valstring) {
        var keyarr = keys;
        var obj = {};
        for (var i = 0; i < keyarr.length; i++) {
            var valreg = new RegExp(keyarr[i].pre + "(.*)" + keyarr[i].post);
            obj[keyarr[i].text] = valstring.match(valreg)[1];
        }
        return obj;
    }

    return parser;
}
于 2012-12-19T22:54:45.610 に答える