Java 库截断 html 字符串?

标签 java string sanitization

我需要截断 html 字符串,该字符串在存储到数据库之前已经被我的应用程序清理过并且仅包含链接、图像和格式标签。但是在呈现给用户时,需要对其进行截断以呈现内容的概览。

所以我需要在java中缩写html字符串这样

<img src="http://d2qxdzx5iw7vis.cloudfront.net/34775606.jpg" />   
<br/><a href="http://d2qxdzx5iw7vis.cloudfront.net/34775606.jpg" />

截断时不会返回这样的内容

<img src="http://d2qxdzx5iw7vis.cloudfront.net/34775606.jpg" />   
<br/><a href="htt

而是返回

<img src="http://d2qxdzx5iw7vis.cloudfront.net/34775606.jpg" />   
<br/>

最佳答案

即使阅读了所有评论,您的要求还是有点模糊。根据您的示例和解释,我假设您的要求如下:

  • 输入是由 (x)html 标签组成的字符串。您的示例不包含此内容,但我假设输入可以包含标签之间的文本。
  • 在您的问题上下文中,我们不关心嵌套。所以输入实际上只是混合了标签的文本,其中开始、结束和自结束标签都被认为是等价的。
  • 标签可以包含引号。
  • 您想截断字符串,使字符串不会在标记中间被截断。因此,在截断的字符串中,每个“<”字符都必须有一个对应的“>”字符。

我会给你两个解决方案,一个简单的可能不正确,具体取决于输入的具体内容,另一个更复杂的正确。

第一个解决方案

对于第一个解决方案,我们首先找到截断大小之前的最后一个“>”字符(这对应于完全关闭的最后一个标签)。在这个字符之后可能是不属于任何标签的文本,所以我们然后搜索最后一个关闭标签之后的第一个 '<' 字符。在代码中:

public static String truncate1(String input, int size)
{
    if (input.length() < size) return input;

    int pos = input.lastIndexOf('>', size);
    int pos2 = input.indexOf('<', pos);

    if (pos2 < 0 || pos2 >= size) {
        return input.substring(0, size);
    }        
    else {
        return input.substring(0, pos2);
    }
}

当然,此解决方案不考虑带引号的值字符串:“<”和“>”字符可能出现在字符串中,在这种情况下应忽略它们。无论如何我都提到了解决方案,因为您提到您的输入已经过处理,因此您可以确保引用的字符串永远不会包含“<”和“>”字符。

第二种方案

要考虑引用的字符串,我们不能再依赖标准的 Java 类,但我们必须自己扫描输入并记住我们当前是否在标记内和字符串内。如果我们在字符串外遇到一个 '<' 字符,我们会记住它的位置,这样当我们到达截断点时,我们就知道最后打开的标签的位置。如果该标签未关闭,我们将在该标签的开头之前截断。在代码中:

public static String truncate2(String input, int size)
{
    if (input.length() < size) return input;

    int lastTagStart = 0;
    boolean inString = false;
    boolean inTag = false;

    for (int pos = 0; pos < size; pos++) {
        switch (input.charAt(pos)) {
            case '<':
                if (!inString && !inTag) {
                    lastTagStart = pos;
                    inTag = true;
                }
                break;
            case '>':
                if (!inString) inTag = false;
                break;
            case '\"':
                if (inTag) inString = !inString;
                break;
        }
    }
    if (!inTag) lastTagStart = size;
    return input.substring(0, lastTagStart);
}

关于Java 库截断 html 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567039/

相关文章:

php - mysql字符串搜索算法查询帮助

node.js - 使用 node.js 清理来自 stdin 的流

php - 有效的SQL注入(inject)防护功能

java - 无法解析我在 Spring Cloud Stream 中通过绑定(bind)器接收到的 Json 对象

c - "concatenation" block 内的字符串 'for'

python - 使用 python 在 CSV 文件中搜索字符串并写入结果

java - 如何清理 Java 生成代码的用户输入?

java - 更改 Swing 进度条的外观

java - jsp无法用空格替换%20?

java - 在Java中使用字符串来接受基于特定要求的密码