2011-03-28 147 views
5

我正在使用Jsoup從表單中清理用戶輸入。有問題的表單包含一個<textarea>,它需要純文本。提交表格時,我用Jsoup.clean(textareaContents)清理輸入;但是,由於html會忽略多餘的空格,因此Jsoup.clean()將從輸入中刪除有價值的空白字符。防止Jsoup丟棄額外的空白

例如,如果有人進入幾行文本在textarea

hello 

test 

Jsoup.clean()後,你將有:

hello test 

你怎麼能Jsoup.clean()保留空白?我知道它是專爲解析HTML而設計的,這不是html,那麼還有更好的選擇嗎?

回答

4

如果你的textarea只是期望純文本,那麼我認爲你最好只用HTML轉義純文本。即分別將用戶的輸入<>標籤轉換爲&lt;&gt;。無論是輸入我們的輸出(輸入可能更安全,所以你只需要考慮一次)。

正如您所說,jsoup HTML cleaner旨在解析不可信輸入HTML並輸出受信任的HTML,其中格式化是通過元素完成的。

8

對於後代,如果您仍然需要使用空格訪問原始文本,則可以使用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()方法。

1

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(); 
} 
+0

我這裏的空白事項和文本穿插着''
一個標籤同樣不尋常的使用情況。我放棄了你的方法,現在一切都很順利(在過去的兩天裏花了數小時的時間)。感謝您花時間發佈您的方法。 – Paul 2017-01-11 16:40:26

+0

爲什麼你有textBuilder.append(node.outerHtml());?這將複製標籤的內容。即「 hello>」將成爲「你好你好」。我錯過了什麼嗎? – Ammar 2017-08-02 18:16:00