TLDR;我需要一个可能复杂字符串的树,从文件中读取并在javascript中变成一个对象。我的问题是,是否存在适用于大多数语言的良好标准格式或可以通过标准文件格式(例如ini文件)执行此操作的简单功能?
我想以用户可读的文件格式存储一些数据,因此我可以轻松地使用文本编辑器对其进行编辑。很多正则表达式,所以可以有许多反斜杠,新行,引号,括号以及我不想写的所有内容:
{
"(html|php|pl|cgi|bak|sh|js)$": {
"report": "/(\\$.{3}\\[10\\]
|letcaro\\.com
|zbUVSfJ\
|<\\?php[ \t]{10}
|l\\(base64_decode
|eval\\s*\\(base64_decode\\s*\\(
|base64_decode\\(\\$_POST
|@error_reporting\\(0\\)
|web shell
...
正如你所看到的那样,有很多双反斜杠,这已经不是有效的json了,因为如果我们尝试像json一样处理它,那么最后会有新行给出“无效控制字符”错误。我们可以将它作为一个字符串加载,然后在它上面运行一个进程(用\ n或者其他一些代替新行)并获得我们要去的地方,但随着这个文件的增长,它会变得更糟。
此系统作为单个简单节点js文件运行,不需要任何依赖项,因此我想避免设置安装程序链以通过npm或bowser或类似的东西引入xml解析器。最糟糕的情况我可以将密钥存储为文件名,文件名的内容作为值。这将是一个巨大的开销和混乱维护。
YAML(这听起来很奇妙,可以在这里创造奇迹)需要外部依赖。 XML(正则表达式的cdata和键的标签很棒)需要外部依赖。
旁注:我也将用其他语言重写这个,php(可以使用json_parse)和ruby(可能需要一个JSON.parse的gem),所以语言不可知是非常好的。
答案 0 :(得分:1)
将您的粗略字符串放在纯文本文件中,或者放在文本完全符合您需要的任何位置。
/(\$.{3}\[10\]
|letcaro\.com
|zbUVSfJ\
|<\?php[ \t]{10}
|l\(base64_decode
|eval\s*\(base64_decode\s*\(
|base64_decode\(\$_POST
|@error_reporting\(0\)
|web shell/
加载并编码。 [PHP]
$text = file_get_contents("derp.txt");
echo json_encode($text);
输出:
"\/(\\$.{3}\\[10\\]\n|letcaro\\.com\n|zbUVSfJ\\\n|<\\?php[ \\t]{10}\n|l\\(base64_decode\n|eval\\s*\\(base64_decode\\s*\\(\n|base64_decode\\(\\$_POST\n|@error_reporting\\(0\\)\n|web shell\/\n"
你会疯狂地试图维护一个包含特殊字符的单个人类可读文件。按预期编写数据,然后使用JSON库对其进行编码。
答案 1 :(得分:1)
要回答您的问题,我个人并不了解任何标准化的方法来完成您的目标。从红宝石的角度来看,我第一次去解决方案可能是JSON或YAML。这两者都需要一些小的外部依赖。如果你想让这种语言不可知并排除任何外部依赖关系,那么我想到的唯一解决方案就是将信息存储在一个文件中(就像你提到的那样)。但是你仍然需要一种方法来解析它,所以如果你不想要外部依赖,你需要用你希望使用该文件的每种语言编写自己的解析器代码。我会选择Sammitch&#39; s诚实地接近。让JSON做所有艰苦的工作。
答案 2 :(得分:0)
我想我刚刚发明了一种新的文件格式。
这是我的测试数据......
Root
Child 1
Value of
this child can be
whatever in a multitude
of lines that won't end up getting
added as a key because it is a leaf.
Child 2
Sub Child 1
This is a deeper item that is a leaf so it also won't become a key.
Sub Child 2
A second sub-child that should become a leaf too.
end
这是我对这个档案的非常难以理解和丑陋的解析器......
function parseTabTree(data) {
var root = { value: 'root' }, obj = root, current = '', lines = data.split('\r\n'), curDepth = -1;
for (ix in lines) {
var line = lines[ix].replace(/^\s+/, '');
var depth = lines[ix].match(/^[\s]*/g)[0].length;
// Shallow, push our current value in and switch target up a level.
if (depth < curDepth) {
obj.value = current;
for (var cl = curDepth - depth; cl > 0; --cl) obj = obj.parent;
last = current = '';
}
// Deep, push our current target to parent and step down a level.
else if (depth > curDepth) {
nobj = {parent: obj, value: current};
if (!obj[current]) obj[current] = [];
obj[current].push(nobj);
obj = nobj;
current = '';
}
// Across
else obj.value += current;
current += line;
curDepth = depth;
}
return root;
}
以下是我在节点中使用它的方法......
var fs = require("fs");
fs.readFile('test.txt', function (err, data) {
obj = parseTabTree(data.toString());
console.log(util.inspect(obj, false, null));
});
最后,我满意的输出!
{ value: 'root',
'':
[ { parent: [Circular],
value: 'test',
Root:
[ { parent: [Circular],
value: 'Root',
'Child 1':
[ { parent: [Circular],
value: 'Value ofthis child can bewhatever in a multitudeof lines that won\'t end up gettingadded as a key because it is a leaf.' } ],
'Child 2':
[ { parent: [Circular],
value: 'Child 2',
'Sub Child 1':
[ { parent: [Circular],
value: 'This is a deeper item that is a leaf so it also won\'t become a key.' } ],
'Sub Child 2':
[ { parent: [Circular],
value: 'A second sub-child that should become a leaf too.' } ] } ] } ] } ] }
仍然存在一些缺陷,例如为一个分支设置多个叶子或者必须在文件的末尾放置一些东西(可以很容易地修复)但是或多或少似乎有效!现在我可以在顶部进行简化的正则表达式检查,并在它们变得更深时使它们变得更复杂。
我将所有内容都放在git repo中,以防有人想要使用它或改进它!