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

テキストエリアがプレーンテキストのみを期待している場合は、プレーンテキストをエスケープする 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 に答える