2012-01-03 20 views
7

Mam ciąg użytkownika złożony zawierający treść HTML takich jakusuwanie pustych par tag z fragmentem HTML

"<p></p><div></div><p>Hello<br/>world</p><p></p>" 

chciałbym przekształcić ten ciąg taki, że puste par zmiennych są usunięte (ale pustych tagów jak <br/> są zachowane). Na przykład, w wyniku tego przekształcenia należy przekonwertować ciąg powyżej

"<p>Hello<br/>world</p>" 

Chciałbym użyć JSoup to zrobić, jak już mam to na mojej ścieżce klas, a to byłoby dla mnie najłatwiejsze wykonaj tę transformację po stronie serwera.

Odpowiedz

21

Oto przykład, który nie tylko, że (przy użyciu JSoup):

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
Document doc = Jsoup.parse(html); 

for (Element element : doc.select("*")) { 
    if (!element.hasText() && element.isBlock()) { 
     element.remove(); 
    } 
} 

System.out.println(doc.body().html()) 

Wyjście kodu powyżej jest to, czego szukasz:

<p>Hello<br />world</p> 
+0

ding, ding, ding, mamy zwycięzcę !!! –

+0

Przetestowałem to i powyższy kod wypisuje '

Witam świat

' –

+2

Zauważyłem, że ten kod usuwa puste img wewnątrz elementu div ex:

, więc sprawdziłem również pod kątem pustego rozmiaru: && element.childNodes(). Size () == 0, czy moja aktualizacja jest poprawna? –

8

Naprawdę nie zna jsoup, ale można to zrobić za pomocą prostego regex zastąpić:

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
html = html.replaceAll("<([^>]*)></\\1>", ""); 

Chociaż z pełnym parsera można prawdopodobnie tylko kropla pustą zawartość podczas przetwarzania, w zależności od tego, co masz w końcu zamierzam z tym zrobić.

+0

replaceAll ("<[a-zA -Z0-9] *> "," "); może wyglądać lepiej niż pozwolić na coś innego niż> –

+0

Ale co z kursywą pogrubioną? Jest to złe użycie, ale nadal jest uzasadnione. Chodzi o to, że musisz dokładnie sprawdzić, co zostało użyte w pierwszym zestawie nawiasów ostrych. – FrankieTheKneeMan

+0

@PragalathanM, rozważałem to, ale tagi pozwalają również na łączniki, podkreślenia itp. Gdy zaczniesz dodawać wszystkie te znaki, instrukcja zaczyna wyglądać brzydko (i możesz tęsknić za niektórymi). –

0

jeśli używasz jQuery, można zrobić to jak

var tags = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 

$("<div id='mydiv'>"+tags+"</div>").appendTo($('body')); 
$('#mydiv').children().each(function(){ 
    var elem = $(this); 
    if(elem.html() === "") elem.remove(); 
}); 

skrzypce: http://jsfiddle.net/LqCx5/2/

+0

Funkcja 'children' generuje błąd. –

+0

zaktualizowałem odpowiedź. Pls check, działa poprawnie, testowałem w moim komputerze. –

+0

Spowoduje to usunięcie wszystkich pustych tagów, w tym

-2

dont know Jsoup poniżej kod działa również z prostego javascript regex. wypróbuj poniższy kod.

function removeall(){ 
var tagarray=new Array("<p>","<div>"); 
source="<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
for (var int = 0; int < tagarray.length; int++) { 
tag2=tagarray[int].replace("<","</"); 
var tagpair=new RegExp(tagarray[int]+tag2,"g"); 
source=source.replace(tagpair,""); 
    } 
alert(source); 

}