【问题标题】:Extract the data between script tag using java regular expression使用java正则表达式提取脚本标签之间的数据
【发布时间】:2016-02-04 16:27:14
【问题描述】:

我想提取脚本标签之间给出的数据。我也为此做了一个正则表达式,但它不适用于这个字符串 -

<script>
var arrowimages = {
  down: ['downarrowclass', 'Images/arrow-down.gif', 23],
  right: ['rightarrowclass', 'Images/submenu-pointer.png']
}

var jqueryslidemenu = {

  animateduration: {
    over: 400,
    out: 400
  }, //duration of slide in/ out animation, in milliseconds

  buildmenu: function (menuid, arrowsvar) {
    jQuery(document).ready(function ($) {
        var $mainmenu = $("#" + menuid + ">ul")
        var $headers = $mainmenu.find("ul").parent()
        $headers.each(function (i) {
            var $curobj = $(this)
            var $subul = $(this).find('ul:eq(0)')
            this._dimensions = {
              w: this.offsetWidth,
              h: this.offsetHeight,
              subulw: $subul.outerWidth(),
              subulh: $subul.outerHeight()
            }
            this.istopheader = $curobj.parents("ul").length == 1 ? true : false
            $subul.css({
              top: this.istopheader ? this._dimensions.h + "px" : 0
            })
            $curobj.children("a:eq(0)").css(this.istopheader ? {
              paddingRight: arrowsvar.down[2]
            } : {}).append(
              '<img src="' + (this.istopheader ? arrowsvar.down[1] : arrowsvar.right[1]) + '" class="' + (this.istopheader ? arrowsvar.down[0] : arrowsvar.right[0]) + '" style="border:0;top:12px;" />'
            )
            $curobj.hover(
                function (e) {
                  var $targetul = $(this).children("ul:eq(0)")
                  this._offsets = {
                    left: $(this).offset().left,
                    top: $(this).offset().top
                  }
                  var menuleft = this.istopheader ? 0 : this._dimensions.w
                  menuleft = (this._offsets.left + menuleft + this._dimensions.subulw > $(window).width()) ? (this.istopheader ? -this._dimensions.subulw + this._dimensions.w : -this._dimensions.w) : menuleft
                  if($targetul.queue().length <= 1) //if 1 or less queued animations
                    $targetul.css({
                    left: menuleft + "px",
                    width: this._dimensions.subulw + 'px'
                  }).slideDown(jqueryslidemenu.animateduration.over)
                },
                function (e) {
                  var $targetul = $(this).children("ul:eq(0)")
                  $targetul.slideUp(jqueryslidemenu.animateduration.out)
                }
              ) //end hover
            $curobj.click(function () {
              $(this).children("ul:eq(0)").hide()
            })
          }) //end $headers.each()
        $mainmenu.find("ul").css({
          display: 'none',
          visibility: 'visible'
        })
      }) //end document.ready
  }
}

//build menu with ID="myslidemenu" on page:
jqueryslidemenu.buildmenu("myjquerymenu", arrowimages)

</script>

我的正则表达式是-&lt;script[^&gt;]*&gt;(.*?)&lt;/script&gt;

&lt;script type="text/javascript" src="JsFiles/jquery.min.js"&gt;&lt;/script&gt; 这样的其他普通脚本标签由我的正则表达式检索,但我不知道为什么它不适用于该特定字符串。我需要文本之间的数据来修改该数据,因此也需要分组。我也尝试过 jsoup 来完成这项任务 -

    Elements scripts = doc.select("script");
 for(Element script: scripts) {
   System.out.println("src " + script);
   String lineread = script.toString();
   String data = script.data();
   if(!data.isEmpty()) {
     System.out.println(data);
     Pattern p = Pattern.compile("\\\"([^\\\"]*)\\\"|'([^']*)'");
     Matcher m = p.matcher(lineread);
     while(m.find()) {
       if(m.group(0).contains(".axd") || m.group(0).contains(".JPG") || m.group(0).contains(".jpg") || m.group(0).contains(".jpeg") || m.group(0).contains(".png") || m.group(0).contains(".js") || m.group(0).contains(".ico") || m.group(0).contains(".gif")) {
         System.out.println("m.g(0) " + m.group(0));
         System.out.println("m.g(1) " + m.group(1));
         String changepath;
         Pattern p1 = Pattern.compile("src=(.*?)>|src=\"(.*?)\"");
         Matcher m1 = p1.matcher(m.group(0));
         if(m1.find()) {
           if(m1.group(0).contains(".axd") || m1.group(0).contains(".JPG") || m1.group(0).contains(".jpg") || m1.group(0).contains(".jpeg") || m1.group(0).contains(".png") || m1.group(0).contains(".js") || m1.group(0).contains(".ico") || m1.group(0).contains(".gif")) {
             System.out.println("inner " + m1.group(0));
             changepath = "\"" + main_url + "" + m1.group(1).replace("\"", "").replace("'", "") + "\"";

             lineread = lineread.replace(m1.group(1), changepath);
             System.out.println("data " + lineread);
           }
         } else {
           changepath = "\"" + main_url + "" + m.group(0).replace("\"", "").replace("'", "") + "\"";

           lineread = lineread.replace(m.group(0), changepath);
           System.out.println("data in src " + lineread);
         }
       }
     }
     script = script.text(lineread);
     System.out.println("final script " + script);

   }
 }

但这里的问题是我在脚本中获得的值(最后一个变量)删除脚本标记之间数据中存在的所有空格。

所以基本上我想要一个正则表达式来获取脚本标记之间的数据,或者我如何在不丢失第二个解决方案的空间的情况下获取数据。

【问题讨论】:

  • 向我们提供您期望的输出结果可能会有所帮助。有时要求可能会在翻译中丢失。 :-)
  • 你遇到了什么错误?
  • 我没有收到任何错误。只是没有检测到该特定标签
  • 我想要这样的输出 - var arrowimages = { down: ['downarrowclass', 'aed.tn.gov.in/Images/arrow-down.gif', 23], right: ['rightarrowclass', 'aed.tn.gov.in/Images/submenu-pointer.png'] } var jqueryslidemenu = { Animationuration: { over: 400, out: 400 }, //滑入/滑出动画的持续时间,以毫秒为单位...................... .............以及之后的完整脚本代码
  • 不要忘记将 Pattern p1 = Pattern.compile("src=(.*?)&gt;|src=\"(.*?)\""); 移出您的 while 循环。它内部是不变的。

标签: javascript java regex jsoup


【解决方案1】:

您可以使用库 js2xml。 https://github.com/redapple/js2xml

import js2xml

jscode = """var arrowimages = {
  down: ['downarrowclass', 'Images/arrow-down.gif', 23],
  right: ['rightarrowclass', 'Images/submenu-pointer.png']
}

var jqueryslidemenu = {

  animateduration: {
    over: 400,
    out: 400
  }, //duration of slide in/ out animation, in milliseconds

  buildmenu: function (menuid, arrowsvar) {
    jQuery(document).ready(function ($) {
        var $mainmenu = $("#" + menuid + ">ul")
        var $headers = $mainmenu.find("ul").parent()
        $headers.each(function (i) {
            var $curobj = $(this)
            var $subul = $(this).find('ul:eq(0)')
            this._dimensions = {
              w: this.offsetWidth,
              h: this.offsetHeight,
              subulw: $subul.outerWidth(),
              subulh: $subul.outerHeight()
            }
            this.istopheader = $curobj.parents("ul").length == 1 ? true : false
            $subul.css({
              top: this.istopheader ? this._dimensions.h + "px" : 0
            })
            $curobj.children("a:eq(0)").css(this.istopheader ? {
              paddingRight: arrowsvar.down[2]
            } : {}).append(
              '<img src="' + (this.istopheader ? arrowsvar.down[1] : arrowsvar.right[1]) + '" class="' + (this.istopheader ? arrowsvar.down[0] : arrowsvar.right[0]) + '" style="border:0;top:12px;" />'
            )
            $curobj.hover(
                function (e) {
                  var $targetul = $(this).children("ul:eq(0)")
                  this._offsets = {
                    left: $(this).offset().left,
                    top: $(this).offset().top
                  }
                  var menuleft = this.istopheader ? 0 : this._dimensions.w
                  menuleft = (this._offsets.left + menuleft + this._dimensions.subulw > $(window).width()) ? (this.istopheader ? -this._dimensions.subulw + this._dimensions.w : -this._dimensions.w) : menuleft
                  if($targetul.queue().length <= 1) //if 1 or less queued animations
                    $targetul.css({
                    left: menuleft + "px",
                    width: this._dimensions.subulw + 'px'
                  }).slideDown(jqueryslidemenu.animateduration.over)
                },
                function (e) {
                  var $targetul = $(this).children("ul:eq(0)")
                  $targetul.slideUp(jqueryslidemenu.animateduration.out)
                }
              ) //end hover
            $curobj.click(function () {
              $(this).children("ul:eq(0)").hide()
            })
          }) //end $headers.each()
        $mainmenu.find("ul").css({
          display: 'none',
          visibility: 'visible'
        })
      }) //end document.ready
  }
}

//build menu with ID="myslidemenu" on page:
jqueryslidemenu.buildmenu("myjquerymenu", arrowimages)"""

parsed = js2xml.parse(jscode)
print js2xml.pretty_print(parsed)

示例输出:

<program>
  <var name="arrowimages">
    <object>
      <property name="down">
        <array>
          <string>downarrowclass</string>
          <string>Images/arrow-down.gif</string>
          <number value="23"/>
        </array>
      </property>
      <property name="right">
        <array>
          <string>rightarrowclass</string>
          <string>Images/submenu-pointer.png</string>
        </array>
      </property>
    </object>
  </var>

然后您就可以解析 XML。 (使用 xpath 更容易)

问候 纳尔逊。

【讨论】:

  • 先生,您的解决方案就在您的位置,但我不能这样更改。我关心的不仅仅是获取图像并改变它的路径。我无法在 xml 中更改我的脚本,因为它不会满足我真正想要的。看,我正在下载我的网页,为了在我的本地主机上显示该图像,我需要给出图像最初存储的确切位置。所以我不能像你在解决方案中给出的那样更改代码
【解决方案2】:

不要使用data() 方法,而是尝试html() 方法。 行String data = script.data(); 变为String data = script.html()

另一方面,如果你想改变脚本标签的src属性,你可以简单地告诉Jsoup为你找到它们:

Elements scripts = doc.select("script[src]");
for(Element script: scripts) {
    String src = script.attr("src");
    if (src.contains(".axd")) {
       script.attr("src", main_url + src);
    }
}

【讨论】:

  • 这不适用于检测这种模式,因为它仅在脚本标签中存在 src 属性时才有效