Java 防止Jsoup丢弃额外的空白
我正在使用Jsoup清理表单中的用户输入。该表单包含一个需要纯文本的Java 防止Jsoup丢弃额外的空白,java,jsoup,Java,Jsoup,我正在使用Jsoup清理表单中的用户输入。该表单包含一个需要纯文本的。提交表单时,我用Jsoup.clean(textareaContents)清理输入;但是,由于html忽略了额外的空格,Jsoup.clean()将从输入中删除有价值的空格字符 例如,如果有人在文本区域中输入了几行文本: hello test 在Jsoup.clean()之后,您将有: hello test 如何使Jsoup.clean()保留空白?我知道它是为解析html而设计的,而这不是html,所以有更好的选择吗?
。提交表单时,我用Jsoup.clean(textareaContents)
清理输入;但是,由于html忽略了额外的空格,Jsoup.clean()
将从输入中删除有价值的空格字符
例如,如果有人在文本区域
中输入了几行文本:
hello
test
在Jsoup.clean()之后,您将有:
hello test
如何使Jsoup.clean()
保留空白?我知道它是为解析html而设计的,而这不是html,所以有更好的选择吗?如果您的textarea只需要纯文本,那么我认为您最好只使用html来转义纯文本。即,将用户输入的
标记分别转换为
和
。无论是输入还是输出(输入可能更安全,所以您只需考虑一次)
正如您所说,设计用于解析不受信任的输入HTML和输出受信任的HTML,其中使用元素进行格式化。对于后代,如果您仍然需要使用空格访问原始文本,可以使用方法
示例代码:
/**
* @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;
}
/**
*@param单元格元素,包含空格格式
*@返回
*/
公共静态字符串getText(元素单元格){
字符串文本=空;
List childNodes=cell.childNodes();
if(childNodes.size()>0){
Node childNode=childNodes.get(0);
if(文本节点的子节点实例){
text=((TextNode)childNode.getWholeText();
}
}
if(text==null){
text=cell.text();
}
返回文本;
}
在上面的代码中,我们假设传入的元素直接在元素体中包含文本内容(我们使用第一个节点)。如果不是这样,它将回到常规方法。Neeme Praks的回答非常好,正确地保留了空白。然而,内联HTML确实把事情搞砸了
<span>This is<br />some text. Cool story.</span>
或者,如果传入一个没有自己文本的元素,它将返回null
因此,为了我的目的,我不得不对该方法进行一些修改。这可能会帮助一些人,所以我把它贴在这里。基本思想是迭代子对象,而不是只取第一个。这还包括一个获取没有子元素的任何元素的HTML的案例
这样,原始代码段将返回:
This is<br />some text. Cool story.
我有一个类似的不寻常的用例,其中空格很重要,文本中添加了
标记。我放弃了你的方法,现在一切都很好(在过去两天花了几个小时在这上面)。感谢您花时间发布您的方法。为什么有textBuilder.append(node.outerHtml());?这将复制标记的内容。ie“hello>”将变成“hellohello”。我错过什么了吗?
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();
}