【问题标题】:Replace "<" and ">" with "&lt;" and "&gt;"将“<”和“>”替换为“<”和“>”
【发布时间】:2013-03-04 22:20:59
【问题描述】:

如果 &amp;lt;&amp;gt; 不是 html 标记的一部分,我想用 &amp;lt;&amp;gt; 替换它。 输入将是一个可能包含某些 html 标签的字符串。它还可以包含小于和大于符号 (">" "

String example1 = "-> <b> Bold </b> <-";
String example2 = "< <i> Italic </i> >"
String example3 = "<i>foo >> </i>"

作为我想要得到的输出:

String output1 = "-&gt; <b> Bold </b> &lt;-";
String output2 = "&lt; <i> Italic </i> &gt;";
String output3 = "<i>foo &gt;&gt; </i>";

所以replaceAll 不起作用,我猜我必须使用正则表达式匹配。有任何想法吗?其他方式?

注意 1: 由于某些项目要求,不能选择第三方库。
注意 2: 我们仅支持 HTML 标记的子集(文本样式标记:斜体、下划线、粗体等)

【问题讨论】:

  • 为了完整起见,“foo >> ”呢?仅仅是您想留下的标签还是它们的内容?
  • @scorpiodawg 我更新了问题,检查一下
  • 哦,还有一个问题:您是希望单独留下 HTML 标签,还是任何看起来像标签的东西?字符串“”的输出应该是什么?
  • 我们支持的 html 标签子集(大约 5 个),它们应该保持原样。所以对于那个输入输出应该是:"<qxg></qxq>"

标签: java android


【解决方案1】:

这是一项非常重要的任务。 HTML 不是常规语言(也许它是不规则的?),因此您无法使用正则表达式对其进行解析。我建议如下:

选项 1

如果您不需要保留空白,请使用此选项。

  1. 从输入中删除所有空格。
  2. 使用“”作为分隔符将输入拆分为标记;保留分隔符。
  3. 流程如下:
    1. 如果令牌不是受支持的 HTML 标记并且包含“
    2. 如果令牌不是受支持的 HTML 标记并且包含“>”,请根据需要转换“>”。
    3. 传递 HTML 标记不变。

选项 2

使用多字符前瞻处理每个输入行。

对于输入中的每个字符。转换字符有 {">", "

  1. 字符是否为转换字符。
  2. 如果否,则前进到下一个字符。
  3. 如果是,请提前确定这是否是受支持的 HTML 标记(这是棘手的部分)。
  4. 如果不是支持的 HTML 标记的一部分,则转换字符。
  5. 如果是支持的 HTML 标记的一部分,则前进到 HTML 标记后面的字符。

【讨论】:

    【解决方案2】:

    如果您只支持五个 html 标签,您可以先从文本中删除这些标签。 将 替换为 ,然后再次添加 html 标记。你 remove 从文本中替换为例如 [b]。对其他标签执行相同操作。

    【讨论】:

      【解决方案3】:

      如果您懒得使用外部库,那么您需要创建一个包含所有 html 标记的数组并针对字符串运行它。

      我真的不推荐它,因为有用于那个的库...

      【讨论】:

        【解决方案4】:

        假设任意 HTML 文件,您必须隔离文本节点并在这些节点上运行 replace

        如果你不能使用现有的库,我就自己写一个。

        (JSoup 可以做到这一点,但它是一个“外部库”——也就是说,不包含在 Java SE 标准中,但只是重新实现它是一种选择。)

        【讨论】:

          【解决方案5】:

          假设字符串包含有效的 HTML tags 。可以应用以下方法来解析字符串以达到您想要的结果:

          private static String parse(String str)
          {
              StringBuilder sBuilder = new StringBuilder();
              for (int i = 0 ; i < str.length() ; i++)
              {
                  char ch = str.charAt(i);
                  if (ch == '>' && i != 0)
                  {
                      char c = str.charAt( i - 1);
                      if (Character.isWhitespace(c) || !Character.isLetter(c))
                      {
                          sBuilder.append("&gt;");
                      }
                      else
                          sBuilder.append(ch);
                  }
                  else if (ch == '>' && i==0)
                  {
                      sBuilder.append("&gt;");
                  }
                  else if (ch == '<' && i < str.length() - 1)
                  {
                      char c = str.charAt( i + 1);
                      if (!(c=='/' || Character.isLetter(c)))
                      {
                          sBuilder.append("&lt;");
                      }
                      else
                          sBuilder.append(ch);
                  }
                  else if (ch == '<' && i == str.length() - 1)
                  {
                      sBuilder.append("&lt;");
                  }
                  else
                  {
                      sBuilder.append(ch);
                  }
              }
              return sBuilder.toString();
          }
          

          【讨论】:

            猜你喜欢
            • 2015-01-14
            • 2016-03-18
            • 1970-01-01
            • 2011-10-10
            • 2019-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多