7

我正在使用 Jsoup 清理表单中的用户输入。有问题的表单包含一个<textarea>需要纯文本的表单。提交表单后,我用Jsoup.clean(textareaContents);清理输入 但是,由于 html 会忽略多余的空格,Jsoup.clean()因此会从输入中删除有价值的空格字符。

例如,如果有人在 中输入了几行文本textarea

hello

test

之后Jsoup.clean(),您将拥有:

hello test

你怎么能Jsoup.clean()保留空白?我知道它是为解析 html 而设计的,这不是 html,所以有更好的选择吗?

4

3 回答 3

11

对于后代,如果您仍然需要访问带有空格的原始文本,您可以使用TextNode.getWholeText()方法。

示例代码:

/**
 * @param cell element that contains whitespace formatting
 * @return
 */
public static String getText(Element cell) {
    String text = null;
    List<Node> childNodes = cell.childNodes();
    if (childNodes.size() > 0) {
        Node childNode = childNodes.get(0);
        if (childNode instanceof TextNode) {
            text = ((TextNode)childNode).getWholeText();
        }
    }
    if (text == null) {
        text = cell.text();
    }
    return text;
}

在上面的代码中,我们假设传入的元素直接在元素主体内包含文本内容(我们取第一个节点)。如果不是这样,它将回退到常规的Element.text()方法。

于 2011-12-29T13:53:57.820 回答
5

如果您的 textarea 只需要纯文本,那么我认为您最好只使用 HTML 转义纯文本。即将用户的输入<>标签分别转换为&lt;&gt;。无论是输入我们的输出(输入可能更安全,所以你只需要考虑一次)。

正如您所说,jsoup HTML 清理器旨在解析不受信任的输入 HTML 并输出受信任的 HTML,其中格式化是使用元素完成的。

于 2011-04-29T09:39:21.073 回答
2

Neeme Praks 的回答非常好,并且正确保留了空格。然而,内联 HTML 真的把它搞砸了。

<span>This is<br />some text.  Cool story.</span>

结果是

"This is"

或者,如果您传入一个没有自己文本的元素,它会返回 null。

所以为了我的目的,我不得不稍微修改一下这个方法。这可能对某些人有所帮助,所以我将其发布在这里。基本思想是迭代孩子而不是只取第一个。这还包括为任何没有子元素的元素获取 HTML 的案例。

这样原始代码段返回:

This is<br />some text.  Cool story.

public static String getText(Element cell) {
    StringBuilder textBuilder = new StringBuilder();
    for (Node node : cell.childNodes()) {
        if (node instanceof TextNode) {
            textBuilder.append(((TextNode)node).getWholeText());
        }
        else {
            for (Node childNode : node.childNodes()) {
                textBuilder.append(getText((Element)childNode));
            }
            textBuilder.append(node.outerHtml());
        }
    }
    if (cell.childNodes().isEmpty()) {
        textBuilder.append(cell.outerHtml());
    }
    return textBuilder.toString();
}
于 2016-01-25T15:37:54.977 回答