【问题标题】:Evaluate html as a String containing <% %> tags with scripts使用脚本将 html 评估为包含 <% %> 标记的字符串
【发布时间】:2016-03-07 17:08:16
【问题描述】:

我的代码中可能有一个小问题,其中我从 Web 服务获取 HTML 作为响应,该服务作为 java 字符串返回。我想在网页上将此字符串显示为 HTML。我面临的问题是返回的html包含一些

形式的脚本
<% ... %>

标签。这些正在网页上显示。我想要的是立即对这些进行评估,而不是在屏幕上显示为文本。 例如,正在显示的文本是

<% if('a' == 'b'){ %> 

你好。

我想摆脱 的东西。

提前致谢。

【问题讨论】:

  • 你得到的 JSP 源不是纯 HTML,所以我会检查为什么会这样(这可能不是故意的)。否则,您可以查找 &lt;%%&gt; 并显示错误或使用正则表达式删除它(例如 String.replaceAll("&lt;%.*?%&gt;",""))。 JSP 代码的问题在于 HTML 结构可能会根据这些标签的评估方式而改变,因此仅删除它们可能不会产生您想要的结果。
  • @Thomas - 是的,没错。每次标签的评估可能不同,因此删除这些标签不是明智之举。 JSP 代码每次都可以在运行时进行评估吗?
  • 好吧,您可以将 JSP 代码提供给 JSP 引擎以对其进行评估,但由于它似乎来自第 3 方服务器,因此我不确定这是否是明智之举。即使您不考虑安全风险(您是否完全信任从该服务器获得的所有代码?)您可能会遇到当前类路径中不存在类、数据丢失等问题。我宁愿让服务器评估 JSP 并仅返回纯 html(或者,如果您愿意,可以返回 JSON 或 XML)。

标签: javascript java html string escaping


【解决方案1】:

如果我理解的话,你想从 Java 字符串中删除这些东西,所以这样的东西可以工作:

String code = "<html> Hello<% if('a' == 'b'){ %>, I'm<% if('a' == 'b'){ %> French</html>";
    int start = 0;
    int end = 0;

    String str = "";

    end = code.indexOf("<%",start); //First substring will do "0 - end";

    while(end != -1 && start != -1){
        str += code.substring(start, end);

        start = code.indexOf("%>",end) +2; //+2 is used to get the index after "%>"
        end = code.indexOf("<%",start); //First occurence of "<%" after the last "%>"
    }

    str += code.substring(start,code.length());//Last substring will do "start - str.len-1"

    System.out.println(str);

更简单的方法

    String code = "<html>Hello<% if('a' == 'b'){ %>, I'm<% if('a' == 'b'){ %> French</html>";
    String str = code.replaceAll("<%.*?%>", "");
    System.out.println(str);

打印

<html>Hello, I'm French</html>

【讨论】:

  • 不,这不是我想要的。阅读我上面的评论以了解情况。我想要动态评估 JSP 代码。不同的条件会在页面上显示不同的html。
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2015-01-26
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多