替换“<”和“>”用“<”和“>”

时间:2013-03-01 17:36:58

标签: java android

我想将<>替换为&lt;&gt;,如果它不是html标记的一部分。 输入将是一个可能包含某些html标记的字符串。它还可以包含少于&amp;大于号(“&gt;”“&lt;”)。 例如:

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标记的一个子集(文本样式标记:斜体,下划线,粗体等)。

5 个答案:

答案 0 :(得分:2)

这是一项非繁琐的任务。 HTML不是常规语言(可能是不规则的?)因此您无法使用正则表达式解析它。我建议如下:

选项1

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

  1. 从输入中删除所有空格。
  2. 使用“&lt;”将输入拆分为令牌和“&gt;”作为分离者;保留分离器。
  3. 流程如下:
    1. 如果令牌不是受支持的HTML标记且包含“&lt;”,则转换“&lt;”根据需要。
    2. 如果令牌不是受支持的HTML标记且包含“&gt;”,请转换“&gt;”根据需要。
    3. 不更改HTML标记。
  4. 选项2

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

    输入中的每个字符。转换字符为{“&gt;”,“&lt;”}

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

答案 1 :(得分:1)

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

我不推荐它,因为有图书馆......

答案 2 :(得分:1)

如果您只支持五个html标记,则可以先从文本中删除这些标记。     替换&lt;和&gt;通过&lt;和&gt;然后再次添加html标记。您remove&lt; b&gt;从文本中通过例如[b]替换它。对其他标签也一样。

答案 3 :(得分:0)

假设任意HTML文件,您必须隔离文本节点并对其运行replace

如果您不能使用现有的库,我只需编写自己的库。

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

答案 4 :(得分:0)

假设字符串包含有效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();
}