防止Jsoup丢弃额外的空格
我正在使用Jsoup来清理表单中的用户输入。 有问题的表单包含一个需要纯文本的 。 提交表单时,我用
Jsoup.clean(textareaContents)
清理输入; 但是,由于html忽略了额外的空格, Jsoup.clean()
将从输入中删除有价值的空白字符。
例如,如果有人在textarea
输入了一些文本行:
hello test
在Jsoup.clean()
,您将拥有:
hello test
你怎么能让Jsoup.clean()
保留空格? 我知道它是为解析html而设计的,这不是html,所以有更好的选择吗?
如果你的textarea只是想要纯文本,那么我认为你最好只用HTML转义纯文本。 即将用户的输入<
和>
标签转换为<
和>
分别。 输入我们的输出(输入可能更安全,所以你只需要考虑一次)。
正如你所说, jsoup HTML清理器旨在解析不受信任的输入HTML和outuput trusted HTML,其中格式化是通过元素完成的。
对于后代,如果仍需要使用空格访问原始文本,则可以使用TextNode.getWholeText()方法。
示例代码:
/** * @param cell element that contains whitespace formatting * @return */ public static String getText(Element cell) { String text = null; List 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()方法。
Neeme Praks的回答非常好,并保留了正确的空白。 但是,内联HTML真的搞砸了。
This is
some text. Cool story.
结果是
"This is"
或者,如果传入的元素没有自己的文本,则返回null。
所以我不得不为我的目的重新修改这个方法。 这可能会帮助一些人,所以我在这里发布它。 基本的想法是迭代孩子,而不是只采取第一个。 这还包括为没有子节点的任何元素抓取HTML的情况。
这样原始代码段返回:
This is
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(); }