2

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

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:由于某些项目要求,不能选择第 3 方库。
注意 2:我们只支持 HTML 标记的子集(文本样式标记:斜体、下划线、粗体等)

4

5 回答 5

2

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

选项1

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

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

选项 2

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

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

  1. 字符是否为转换字符。
  2. 如果否,则前进到下一个字符。
  3. 如果是,请提前确定这是否是受支持的 HTML 标记(这是棘手的部分)。
  4. 如果不是受支持的 HTML 标记的一部分,则转换字符。
  5. 如果是受支持的 HTML 标记的一部分,则前进到 HTML 标记之后的字符。
于 2013-03-01T17:51:58.323 回答
1

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

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

于 2013-03-01T17:40:11.407 回答
1

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

于 2013-03-02T09:53:00.713 回答
0

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

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

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

于 2013-03-01T17:44:35.163 回答
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();
}
于 2013-03-01T19:08:46.610 回答