01/10/2018, 08:41

Cần giúp đỡ regex

Mình có đoạn string sau cần regex bằng c#:

//<![CDATA[
  (function(){
    var a = function() {try{return !!window.addEventListener} catch(e) {return !1} },
    b = function(b, c) {a() ? document.addEventListener("DOMContentLoaded", b, c) : document.attachEvent("onreadystatechange", b)};
    b(function(){
      var a = document.getElementById('cf-content');a.style.display = 'block';
      setTimeout(function(){
        var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={"jKh":+((!+[]+!![]+[])+(+[]))};
        t = document.createElement('div');
        t.innerHTML="<a href='/'>x</a>";
        t = t.firstChild.href;r = t.match(/https?:///)[0];
        t = t.substr(r.length); t = t.substr(0,t.length-1);
        a = document.getElementById('jschl-answer');
        f = document.getElementById('challenge-form');
        ;WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length; '; 121'
        f.submit();
      }, 4000);
    }, false);
  })();
  //]]>

Chuỗi cần lấy sau khi regex:

var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={"jKh":+((!+[]+!![]+[])+(+[]))};
t='demo',a='demo'
WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length;
明玉 viết 10:44 ngày 01/10/2018

Đừng có lấy regex mà đi parse code, chẳng đi về đâu được đâu, lại còn khó bảo trì nữa, đây là javascript, vậy bạn nên tìm thư viện xử lý javascript trên C#, giới thiệu cho bạn 2 thư viện rất tốt:

  • Nil.JS (https://github.com/nilproject/NiL.JS)
  • Xử lý được ES6 (chưa hoàn chỉnh);
  • Có method parse Javascript, sinh ra một cấu trúc dữ liệu (ở dạng mảng) thể hiện toàn bộ nội dung javascript, bạn có thể duyệt mảng rồi tìm cái lệnh mà bạn cần, do là hàm ẩn nên phải dùng Reflection để chạy.
  • Jint (https://github.com/sebastienros/jint)
  • Xử lý tới ES5;
  • Cách parse javascript, bạn xem cái này: https://github.com/sebastienros/jint/issues/35, cũng sinh ra cấu trúc dạng mảng luôn.

Chính xác là 2 lib này đổi từ Javascript sang cấu trúc AST (https://vi.wikipedia.org/wiki/Cây_cú_pháp_trừu_tượng)

Code để parse bên Jint:

var scriptString = @"console.log(""Hello world"");";
var parser = new Jint.Parser.JavaScriptParser();
var program = parser.Parse(scriptString, new Jint.Parser.ParserOptions { Tokens = true });
// truy cập vào program để lấy đúng Statement, hình như có 1 property của nó cho phép lấy đoạn code, mình ít dùng cái này nên không rõ

Code để parse bên Nil.JS (phân tích cấu trúc dữ liệu của nó khá là dài, nên mình bày bạn cách gọi lệnh parse thôi):

using NiL.JS;
using NiL.JS.Core;
using NiL.JS.BaseLibrary;
using NiL.JS.Statements;
namespace ParseJS
{
   static class Experiment
   {
      public static void Run()
      {
         // mình sửa lại theo lời của của bác tác giả lib này
         var scriptString = @"console.log(""Hello world"");";
         var module = new Module(scriptString);
         var astRoot = module.Root;
         // truy cập vào trong astRoot để xử lý và lấy lệnh mình cần, tìm được Statement đúng rồi thì có thể dùng ToString() để lấy nó ra
      }
   }
}

Lương Tuấn viết 10:55 ngày 01/10/2018

Cảm ơn bạn đã giải thích.
Tớ regex đoạn đó để cho vào Jint mà.
Sau khi regex được đoạn:
var s,t,o,p,b,r,e,a,k,i,n,g,f, WrxdrAA={“jKh”:+((!+[]+!![]+[])+(+[]))};
t=‘demo’,a=‘demo’
WrxdrAA.jKh-=+((!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));WrxdrAA.jKh*=+((+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]));WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));WrxdrAA.jKh-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]));WrxdrAA.jKh+=!+[]+!![]+!![]+!![]+!![]+!![];WrxdrAA.jKh+=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));a.value = parseInt(WrxdrAA.jKh, 10) + t.length;

Thì cho vào jint nó sẽ ra kết quả luôn.
Jint không chạy được các lệnh: t = document.createElement(‘div’);
t.innerHTML=“x”; … nên tớ mới muốn regex xoá hết đoạn này đi mà?

Bạn có skype không cho tớ hỏi chút

Dmitry Polhovich viết 10:47 ngày 01/10/2018

Do not use Tools.RemoveComments (NiL.JS) directly. This method stops processing after char ‘/’ and returns only part of code. If you want to get AST see Module.Root. It is root of AST.

明玉 viết 10:48 ngày 01/10/2018

Thanks, I have edited my post

Bài liên quan
0