2014-12-30 2 views
0

TLDR; 나는 복잡한 문자열의 트리가 필요하고, 파일을 읽고, 자바 스크립트에서 객체로 바뀐다. 내 질문은 표준 형식 (예 : 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 용 보석이 필요할 수도 있음)로 다시 작성하므로 언어 ​​불가 지론이 매우 좋을 것입니다.

답변

1
  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/ 
    
  2. 로드하고 인코딩하십시오. [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 라이브러리를 사용하여 인코딩하십시오.

+0

나는이 함께했다 문제는, 그때 그때 JSON으로 모두 컴파일 스크립트를 만들어 내 컴파일되지 않은 시스템을 가지고해야한다는 것입니다, 다음, 완성 된 제품이있다. 제가 생각하기에 새 파일 형식을 작성하는 것은 선의 시작 부분에 여러 공백 문자를 사용하여 깊이를 정의한 다음 객체를 만드는 간단한 함수 하나를 사용하여 크롤링하는 것입니다. 이 함수는 다른 언어로 다시 작성하겠습니다. (이 언어는 상당히 불가지론적이고 제 3 자 라이브러리에 의존하지 않습니다.)이 함수를 완성 할 수 있다면 말입니다. – Xedecimal

1

귀하의 질문에 대답하기 위해, 나는 당신이하고자하는 것을 이루기위한 표준화 된 방법을 개인적으로 알지 못합니다. 루비 관점에서, 솔루션에 대한 나의 첫 번째 시도는 JSON 또는 YAML이었을 것이다. 둘 다 작은 외부 종속성이 필요합니다. 이 언어에 의존하지 않고 외부 종속성을 제외시키려는 경우, 위에서 언급 한 것처럼 정보를 파일에 저장하는 방법 만 고려하면됩니다. 그러나 당신은 여전히 ​​그것을 분석 할 방법이 필요합니다. 그래서 외부 의존성을 원하지 않는다면 파일을 사용하고자하는 각 언어로 자신의 파서 코드를 작성해야합니다. Sammitch의 접근법을 솔직하게 생각해 보겠습니다. JSON이 모든 노력을 기울 이도록하십시오.

+0

확실히 파일에 추가됩니다. 이것은 기본적으로 큰 문자열로 저장됩니다. 나는 각 언어로 파서를 작성하는쪽으로 더 기울이고있다. – Xedecimal

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 

다음은이 파일에 대한 나의 몹시 innefecient 못생긴 파서의 ...

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에 넣습니다!

https://github.com/Xedecimal/tabtree

관련 문제