2009-11-09 24 views
10

Czy istnieje wyrażenie regularne, które może całkowicie usunąć znacznik HTML? Przy okazji, używam Java.Jak usunąć znacznik HTML w Javie

+2

wpisując swój tytuł w polu wyszukiwania, mam następujące: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + w + Java ... czy nie dostałeś tego samego, kiedy publikowałeś pytanie? – kdgregory

+2

Nie znalazłem żadnych duplikatów. Te pytania dotyczą ekstrakcji tekstu z HTML: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow.com/questions/832620/stripping-html-tags-in-java – tangens

Odpowiedz

20

Zamiast tego należy użyć parsera HTML. Podoba mi się htmlCleaner, ponieważ daje mi to dość wydrukowaną wersję HTML.

Z htmlCleaner można zrobić:

TagNode root = htmlCleaner.clean(stream); 
Object[] found = root.evaluateXPath("//div[id='something']"); 
if(found.length > 0 && found instanceof TagNode) { 
    ((TagNode)found[0]).removeFromTree(); 
} 
+0

Dzięki za skierowanie mnie do htmlCleaner :) – exhuma

+0

Czy potrzebujemy uzyskać jakąkolwiek bibliotekę w celu użycia powyższego kodu? I root.evaluateXPath ("// div [id = 'something']"); w tym "czymś" może być każdy idit? proszę daj mi znać. dzięki –

4

nr Wyrażenia regularne nie mogą z definicji parsowania HTML.

Możesz użyć wyrażeń regularnych do s/<[^>]*\>// lub czegoś naiwnego, ale będzie to niewystarczające, szczególnie jeśli chcesz usunąć zawartość tagów.

Jak powiedział inny plakat, użyj rzeczywistego parsera HTML.

4

Jeśli wystarczy usunąć tagi następnie można użyć tego wyrażenia regularnego:

content = content.replaceAll("<[^>]+>", ""); 

usunie tylko tagów HTML, ale nie innych rzeczy. Dla bardziej złożonych rzeczy powinieneś użyć parsera.

EDIT: Aby uniknąć problemów z HTML komentarze można wykonać następujące czynności:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", ""); 
+0

Ponieważ nie używasz żadnych znaków mięsa '.','^'i' $ ', flagi' s'- i 'm' można pominąć. –

+0

To wyrażenie może powodować zniekształcenie, jeśli HTML zawiera komentarze XML z osadzonymi znakami "<' or '>". –

0

Alternatywnie, jeśli zamiarem jest wyświetlaczu wejściowe użytkownika sterowany z powrotem do klienta, a następnie można również po prostu wymień wszystkie < przez &lt; i wszystkie > przez &gt;. W ten sposób HTML nie zostanie zinterpretowany jako "jest" przez aplikację klienta (przeglądarkę internetową).

Jeśli używasz JSP jako technologii wyświetlania, możesz użyć do tego JSTL c:out. Unika domyślnie wszystkich jednostek HTML. Na przykład:

<c:out value="<script>alert('XSS');</script>" /> 

NIE wyświetli alertu, ale po prostu pokazuje rzeczywisty ciąg bez zmian.

0

można użyć tego prostego kodu, aby usunąć wszystkie znaczniki HTML ...

htmlString.replaceAll("\\<.*?\\>", "")) 
+1

Spowoduje to tylko usunięcie znaczników otwierających i pozostawienie tagów zamykających nieobsługiwanych. – jlordo

+0

Nigdy nie wykonywałbym takiej pracy samemu - parsowanie html na zwykły tekst jest naprawdę pracowitą koleją. – jebbie

+0

To zadziałało, ale może zależy od złożoności tagów, komentarzy, skryptów itp. Tak więc, dla złożonego przypadku może być lepiej biblioteka HTML. – jmoran

16

Jest JSoup który jest biblioteką Java wykonane do manipulacji HTML. Spójrz na metodę clean() i obiekt WhiteList. Łatwe w użyciu rozwiązanie!

+2

WOW, sir, naprawdę zrobiłem mój dzień, lubię to, TAK! Markdownj, Markdown4J, htmlCleaner .. wszystkie z nich są ***** przepraszam .. JSoup to jedyny sposób, w którym naprawdę osiąga się to dzięki jednemu liniowemu: String plain = new HtmlToPlainText(). GetPlainText (Jsoup.parse (html)); – jebbie

+4

Krótszy kod to 'String tekstowy = Jsoup.parse (html) .text();' – jrarama

+2

@jrarama - Wcale. 'Jsoup.parse (html) .text()' usuwa wszystkie znaczniki i białe znaki, pozostawiając tylko długi wiersz tekstu, podczas gdy 'new HtmlToPlainText(). GetPlainText (Jsoup.parse (html))' formatuje tekst w uproszczony sposób, zachowując podział na wiersze, akapity, punkty wypunktowania itp. – isapir

1

Nie potrzebujesz żadnego analizatora HTML. Poniższy kod usuwa wszystkie komentarze HTML:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");