Преобразование обычного текста в текст HTML в Java - PullRequest
15 голосов
/ 27 февраля 2011

У меня есть Java-программа, которая будет получать простой текст с сервера.Простой текст может содержать URL-адреса.Есть ли класс в библиотеке Java для преобразования простого текста в текст HTML?Или любая другая библиотека?Если нет, то каково решение?

Ответы [ 6 ]

22 голосов
/ 27 февраля 2011

Вы должны сделать некоторые замены в тексте программно.Вот некоторые подсказки:

  • Все символы новой строки должны быть преобразованы в "<br>\n" (\ n для лучшей читаемости вывода).
  • Все CR должны быть отброшены (кто использует DOSв любом случае).
  • Все пары пробелов следует заменить на " &nbsp;"
  • Заменить "<" на <code>"&lt;"
  • Заменить "&" на "&amp;"
  • Все остальные символы <128 следует оставить без изменений. </li>
  • Все остальные символы> = 128 следует записать как "&#"+((int)myChar)+";", чтобы сделать их читаемыми в любой кодировке.
  • Чтобы автоматически определять ваши ссылки, вы можете использовать регулярное выражение типа "http://[^ ]+" или "www.[^ ]" и конвертировать их, как сказал JB Nizet .на "<a href=\""+url+"\">"+url+"</a>", но только после выполнения всех других замен.

Код для этого выглядит примерно так:

public static String escape(String s) {
    StringBuilder builder = new StringBuilder();
    boolean previousWasASpace = false;
    for( char c : s.toCharArray() ) {
        if( c == ' ' ) {
            if( previousWasASpace ) {
                builder.append("&nbsp;");
                previousWasASpace = false;
                continue;
            }
            previousWasASpace = true;
        } else {
            previousWasASpace = false;
        }
        switch(c) {
            case '<': builder.append("&lt;"); break;
            case '>': builder.append("&gt;"); break;
            case '&': builder.append("&amp;"); break;
            case '"': builder.append("&quot;"); break;
            case '\n': builder.append("<br>"); break;
            // We need Tab support here, because we print StackTraces as HTML
            case '\t': builder.append("&nbsp; &nbsp; &nbsp;"); break;  
            default:
                if( c < 128 ) {
                    builder.append(c);
                } else {
                    builder.append("&#").append((int)c).append(";");
                }    
        }
    }
    return builder.toString();
}

Однако преобразование ссылки еще не выполнено.быть добавленным.Если кто-то это делает, обновите код.

7 голосов
/ 28 февраля 2011

Я нашел решение, используя сопоставление с образцом. Вот мой код -

String str = "(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”‘’]))";
Pattern patt = Pattern.compile(str);
Matcher matcher = patt.matcher(plain);
plain = matcher.replaceAll("<a href=\"$1\">$1</a>");

А вот вход и выход -

Вводимый текст является переменным plain:

some text and then the URL http://www.google.com and then some other text.

Выход:

some text and then the URL <a href="http://www.google.com">http://www.google.com</a> and then some other text.
3 голосов
/ 27 февраля 2011

Если ваш обычный текст равен a URL (отличается от , содержащего a гиперссылка , как вы написали в своем вопросе), затем преобразование его в гиперссылку в HTML просто выполняется с помощью

String hyperlink = "<a href='" + url + "'>" + url + "</a>";
2 голосов
/ 17 марта 2017

Используйте это

public static String stringToHTMLString(String string) {
    StringBuffer sb = new StringBuffer(string.length());
    // true if last char was blank
    boolean lastWasBlankChar = false;
    int len = string.length();
    char c;

    for (int i = 0; i < len; i++) {
        c = string.charAt(i);
        if (c == ' ') {
            // blank gets extra work,
            // this solves the problem you get if you replace all
            // blanks with &nbsp;, if you do that you loss 
            // word breaking
            if (lastWasBlankChar) {
                lastWasBlankChar = false;
                sb.append("&nbsp;");
            } else {
                lastWasBlankChar = true;
                sb.append(' ');
            }
        } else {
            lastWasBlankChar = false;
            //
            // HTML Special Chars
            if (c == '"')
                sb.append("&quot;");
            else if (c == '&')
                sb.append("&amp;");
            else if (c == '<')
                sb.append("&lt;");
            else if (c == '>')
                sb.append("&gt;");
            else if (c == '\n')
                // Handle Newline
                sb.append("<br/>");
            else {
                int ci = 0xffff & c;
                if (ci < 160)
                    // nothing special only 7 Bit
                    sb.append(c);
                else {
                    // Not 7 Bit use the unicode system
                    sb.append("&#");
                    sb.append(new Integer(ci).toString());
                    sb.append(';');
                }
            }
        }
    }
    return sb.toString();
}
1 голос
/ 19 сентября 2016

В приложении Android я только что реализовал HTMLifying содержимого (см. https://github.com/andstatus/andstatus/issues/375).Фактическое преобразование было выполнено в литературных 3 строках кода с использованием системных библиотек Android.Это дает преимущество использования лучшей реализации в каждой последующей версии библиотек Android.

private static String htmlifyPlain(String textIn) {
    SpannableString spannable = SpannableString.valueOf(textIn);
    Linkify.addLinks(spannable, Linkify.WEB_URLS);
    return Html.toHtml(spannable);
}
1 голос
/ 21 августа 2012

Только что присоединился к кодам из всех ответов:

private static String txtToHtml(String s) {
        StringBuilder builder = new StringBuilder();
        boolean previousWasASpace = false;
        for (char c : s.toCharArray()) {
            if (c == ' ') {
                if (previousWasASpace) {
                    builder.append("&nbsp;");
                    previousWasASpace = false;
                    continue;
                }
                previousWasASpace = true;
            } else {
                previousWasASpace = false;
            }
            switch (c) {
                case '<':
                    builder.append("&lt;");
                    break;
                case '>':
                    builder.append("&gt;");
                    break;
                case '&':
                    builder.append("&amp;");
                    break;
                case '"':
                    builder.append("&quot;");
                    break;
                case '\n':
                    builder.append("<br>");
                    break;
                // We need Tab support here, because we print StackTraces as HTML
                case '\t':
                    builder.append("&nbsp; &nbsp; &nbsp;");
                    break;
                default:
                    builder.append(c);

            }
        }
        String converted = builder.toString();
        String str = "(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”‘’]))";
        Pattern patt = Pattern.compile(str);
        Matcher matcher = patt.matcher(converted);
        converted = matcher.replaceAll("<a href=\"$1\">$1</a>");
        return converted;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...