Regex获取脚本函数体

Regex to get scriptfunction body

本文关键字:函数体 脚本 获取 Regex      更新时间:2023-09-26

我有一个文档,需要这个文档中的函数体

这是文档的一部分

<script type="text/javascript">
  //<![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 t,r,a,f, vsFCUji={"GqfTZuOkv":+((!+[]+!![]+!![]+[])+(+[]))};
        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');
        ;vsFCUji.GqfTZuOkv+=+((+!![]+[])+(!+[]+!![]+!![]));vsFCUji.GqfTZuOkv+=!+[]+!![]+!![];vsFCUji.GqfTZuOkv+=+((+!![]+[])+(+[]));vsFCUji.GqfTZuOkv+=+((!+[]+!![]+!![]+!![]+[])+(+[]));vsFCUji.GqfTZuOkv-=+((!+[]+!![]+[])+(+[]));a.value = parseInt(vsFCUji.GqfTZuOkv, 10) + t.length;
        f.submit();
      }, 4000);
    }, false);
  })();
  //]]>
</script>

这是我需要的结果从setTimeout(function(){:

+((!+[]+!![]+!![]+[])+(+[]))

我将使用这个命令获取文档

Document document = Jsoup.connect(encoded_url).timeout(10000).userAgent("Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0;  rv:11.0) like Gecko").method(Connection.Method.GET).get();

然后我运行这个命令从文档中获取函数体。

Pattern pattern_1 = Pattern.compile("setTimeout''(function''('')''{'s*.*?.*:(.*?)};");                 
Matcher m = pattern_1.matcher(document.html());
Log.d("Matcher", "output:" + m.matches());

Wiktor Stribiżew提出的解决方案

一个问题是,您使用的匹配需要一个完整的字符串匹配。另一个是有很多线,而且。在你的情况下没有模式。DOTALL不匹配换行符。可以有未知数量的{和}。