Czy istnieje dobry sposób na usunięcie HTML z ciągu Java? Proste wyrażenie regularne
replaceAll("\\<.*?>","")
będzie działać, ale rzeczy takie jak &
nie będą poprawnie konwertowane, a nie HTML między dwoma nawiasami kątowymi zostanie usunięty (tj. .*?
w wyrażeniu regularnym zniknie).
Odpowiedzi:
Użyj parsera HTML zamiast wyrażenia regularnego. To jest bardzo proste z Jsoup .
Jsoup również wspiera usuwanie tagów HTML przeciwko konfigurowalny białej listy, co jest bardzo przydatne, jeśli chcesz zezwolić tylko przykład
<b>
,<i>
i<u>
.Zobacz też:
źródło
Jsoup#clean()
zamiast tego.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Znów HTML nie jest zwykłym językiem . To jest całkowicie poza mną, dlaczego wszyscy próbują rzucić na nie wyrażenie regularne, aby przeanalizować części zainteresowania, zamiast używać prawdziwego parsera.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
aby zachować przełamania liniiJeśli piszesz dla Androida, możesz to zrobić ...
źródło
Jeśli użytkownik wejdzie
<b>hey!</b>
, czy chcesz wyświetlić<b>hey!</b>
lubhey!
? Jeśli pierwszy, uciekaj mniej niż, i kodowania html ampersands (i opcjonalnie cytuje) i wszystko w porządku. Modyfikacja kodu w celu wdrożenia drugiej opcji to:ale napotkasz problemy, jeśli użytkownik wpisze coś zniekształconego, na przykład
<bhey!</b>
.Możesz także sprawdzić JTidy, który przeanalizuje „brudne” dane HTML i powinien dać ci sposób na usunięcie tagów, zachowując tekst.
Problem z próbą usuwania html polega na tym, że przeglądarki mają bardzo łagodny parser, bardziej łagodny niż jakakolwiek biblioteka, którą można znaleźć, więc nawet jeśli zrobisz wszystko, aby usunąć wszystkie tagi (używając powyższej metody zastępowania, biblioteki DOM lub JTidy) , nadal musisz zakodować wszystkie pozostałe znaki specjalne HTML, aby zachować bezpieczeństwo wyników.
źródło
Innym sposobem jest użycie javax.swing.text.html.HTMLEditorKit do wyodrębnienia tekstu.
ref: Usuń tagi HTML z pliku, aby wyodrębnić tylko TEKST
źródło
Myślę, że najprostszym sposobem filtrowania tagów HTML jest:
źródło
Również bardzo proste przy użyciu Jericho , i możesz zachować część formatowania (na przykład podziały wierszy i łącza).
źródło
Akceptowana odpowiedź zrobienia
Jsoup.parse(html).text()
ma po prostu 2 potencjalne problemy (z JSoup 1.7.3):<script>
na<script>
Jeśli użyjesz tego do ochrony przed XSS, będzie to trochę denerwujące. Oto mój najlepszy strzał na ulepszone rozwiązanie, używając zarówno JSoup, jak i Apache StringEscapeUtils:
Zauważ, że ostatnim krokiem jest to, że muszę użyć danych wyjściowych jako zwykłego tekstu. Jeśli potrzebujesz tylko danych wyjściowych HTML, powinieneś być w stanie je usunąć.
A oto kilka przypadków testowych (dane wejściowe do danych wyjściowych):
Jeśli znajdziesz sposób na ulepszenie, daj mi znać.
źródło
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. To samo dotyczy&
. JSoup nie konwertuje<script> into <script>
, robi to, ponieważ wywołujeszStringEscapeUtils.unescapeHtml
po wyczyszczeniu danych wejściowych przez JSoup.Na Androidzie spróbuj:
źródło
Ucieczka HTML jest naprawdę trudna do zrobienia - zdecydowanie sugerowałbym użycie do tego kodu bibliotecznego, ponieważ jest o wiele bardziej subtelny, niż mogłoby się wydawać. Sprawdź StringEscapeUtils Apache'a, aby znaleźć całkiem dobrą bibliotekę do obsługi tego w Javie.
źródło
To powinno działać -
Użyj tego
i to
źródło
Być może zechcesz zastąpić
<br/>
i</p>
otagować nowymi liniami przed usunięciem HTML, aby nie stał się nieczytelnym bałaganem, jak sugeruje Tim.Jedynym sposobem, w jaki mogę wymyślić usunięcie tagów HTML, ale pozostawienie kodu innego niż HTML między nawiasami kątowymi, byłoby sprawdzenie na liście tagów HTML . Coś w tym stylu ...
Następnie odkoduj znaki specjalne HTML, takie jak
&
. Wynik nie powinien być uważany za zdezynfekowany.źródło
Alternatywnie można użyć HtmlCleaner :
źródło
Przyjęta odpowiedź nie zadziałała dla wskazanego przeze mnie przypadku testowego: wynikiem „a <b lub b> c” jest „ab lub b> c”.
Więc zamiast tego użyłem TagSoup. Oto ujęcie, które zadziałało w moim przypadku testowym (i kilku innych):
źródło
Wiem, że to stare, ale właśnie pracowałem nad projektem, który wymagał ode mnie filtrowania HTML i działało to dobrze:
zamiast tego:
źródło
Oto nieco bardziej rozbudowana aktualizacja, aby spróbować poradzić sobie z formatowaniem przerw i list. Użyłem wyników Amayi jako przewodnika.
źródło
Posługiwać się
Html.fromHtml
Tagi HTML są
Zgodnie z oficjalnymi dokumentacjami Androida wszelkie tagi w HTML będą wyświetlane jako ogólny ciąg zastępczy, który następnie program może przejść i zastąpić prawdziwymi ciągami .
Html.formHtml
Metoda przyjmujeHtml.TagHandler
jako argumenty argument Html.ImageGetter oraz tekst do analizy.Przykład
Następnie
Wynik
To o mnie tekst, który użytkownik może umieścić w swoim profilu
źródło
Oto jeszcze jeden wariant sposobu zamiany wszystkich (Tagi HTML | Elementy HTML | Puste miejsce w treści HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
gdzie treść jest ciągiem.źródło
Możesz po prostu użyć domyślnego filtra HTML Androida
Powyższa metoda zwróci filtrowany ciąg HTML do wprowadzenia.
źródło
Jeszcze jednym sposobem może być użycie klasy com.google.gdata.util.common.html.HtmlToText, np.
Nie jest to jednak kod kuloodporny, a kiedy uruchamiam go na pozycjach wikipedii, również otrzymuję informacje o stylu. Uważam jednak, że w przypadku małych / prostych prac byłoby to skuteczne.
źródło
Wygląda na to, że chcesz przejść z HTML do zwykłego tekstu.
Jeśli tak jest, spójrz na www.htmlparser.org. Oto przykład, który usuwa wszystkie tagi z pliku HTML znalezionego pod adresem URL.
Wykorzystuje org.htmlparser.beans.StringBean .
źródło
Oto inny sposób, aby to zrobić:
źródło
W tym celu można również użyć Apache Tika . Domyślnie zachowuje białe znaki z pozbawionego kodu HTML, co może być pożądane w niektórych sytuacjach:
źródło
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Jednym ze sposobów zachowania informacji o nowej linii w JSoup jest poprzedzenie wszystkich nowych tagów linii jakimś fikcyjnym łańcuchem, wykonanie JSoup i zastąpienie fikcyjnego łańcucha "\ n".
źródło
źródło
Moje 5 centów:
źródło
Aby uzyskać sformatowany zwykły tekst HTML, możesz to zrobić:
Aby uzyskać sformatowany zwykły tekst, zmień <br/> o \ n i zmień ostatni wiersz o:
źródło
Wiem, że minęło trochę czasu, odkąd zadano to pytanie, ale znalazłem inne rozwiązanie, oto, co zadziałało dla mnie:
źródło
możesz po prostu stworzyć metodę z wieloma podobnymi replaceAll ()
Użyj tego linku, aby znaleźć najczęściej potrzebne zamienniki: http://tunes.org/wiki/html_20special_20characters_20 i_20symbols.html
To proste, ale skuteczne. Najpierw używam tej metody do usuwania śmieci, ale nie do pierwszego wiersza, tj. ReplaceAll („\ <. *?>”, „”), A następnie używam określonych słów kluczowych do wyszukiwania indeksów, a następnie używam .substring (start, end ) metoda usuwania niepotrzebnych rzeczy. Ponieważ jest to bardziej niezawodne i możesz dokładnie wskazać, czego potrzebujesz na całej stronie HTML.
źródło
Usuń tagi HTML z łańcucha. Gdzieś musimy przeanalizować jakiś ciąg, który jest odbierany przez niektóre odpowiedzi, takie jak Httpresponse z serwera.
Więc musimy to przeanalizować.
Tutaj pokażę, jak usunąć tagi HTML z ciągu.
źródło
new System.Text.RegularExpressions.Regex();
od?