Предотвратить Jsoup от удаления лишних пробелов - PullRequest
5 голосов
/ 28 марта 2011

Я использую Jsoup для очистки пользовательского ввода из формы.Форма, о которой идет речь, содержит <textarea>, ожидающий простой текст.Когда форма отправлена, я очищаю ввод с помощью Jsoup.clean(textareaContents);однако, поскольку html игнорирует лишние пробелы, Jsoup.clean() удалит ценные пробельные символы из ввода.

Например, если кто-то ввел несколько строк текста в textarea:

hello

test

после Jsoup.clean() у вас будет:

hello test

Как вы можете Jsoup.clean() сохранить пробелы?Я знаю, что он предназначен для анализа html, и это не html, так есть ли лучшая альтернатива?

Ответы [ 3 ]

9 голосов
/ 29 декабря 2011

Для будущих поколений, если вам все еще нужно получить доступ к оригинальному тексту с пробелами, вы можете использовать метод 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 () .

4 голосов
/ 29 апреля 2011

Если ваша текстовая область ожидает только простой текст, то я думаю, что вам будет лучше использовать HTML, избегая простого текста. То есть преобразовать введенные пользователем теги < и > в &lt; и &gt; соответственно. Либо при вводе нашего вывода (ввод может быть более безопасным, поэтому вам нужно подумать об этом только один раз).

jsoup HTML cleaner , как вы говорите, предназначен для анализа ненадежного ввода HTML и вывода доверенного HTML, где форматирование выполняется с элементами.

2 голосов
/ 25 января 2016

Neeme Praks ответил очень хорошо и правильно сохранил пробелы. Тем не менее, встроенный HTML действительно портит это.

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

Результаты в

"This is"

Или, если вы передаете элемент, который не имеет собственного текста, он возвращает ноль.

Так что мне пришлось немного переделать метод для моих целей. Это может помочь некоторым людям, поэтому я публикую это здесь. Основная идея состоит в том, чтобы итерировать детей вместо того, чтобы просто брать первого. Это также включает в себя случай, чтобы захватить 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();
}
...