構文エラーを起こすHTMLをjsoupで綺麗にする

はい。
半年以上ぶりです。

信頼できないユーザーの入力タグをどうすれば楽にきれいに出来るか考えてみたりしてました。
ある程度まともな動きをしてくれそうなものがあったのでメモを兼ねて。

以前にも書いたjsoupでやってみます。

jsoupでHTMLをパースする - するめとめがね

コードは以下のような感じ。

String str = "<div><a href=\"#1\">aaa<a href=\"#2\">bbb</div></div></div>";
Document doc = Jsoup.parseBodyFragment(str);
doc.outputSettings().prettyPrint(false);
System.out.println(doc.body().html());

prettyPrintってやつはデフォルトtrueなんですが、これがtrueだとhtmlメソッドを使ってStringにしたとき、インデントやら改行やら素敵な感じでやってくれちゃうんですが、今回全く求めてないので問答無用でfalseにします。

結果

<div>
 <a href="#1">aaa</a>
 <a href="#2">bbb</a>
</div>

※prettyPrintがfalseになってるので実際は整形されないんですが、わかりづらいのでtrueの状態を書いてます。

うむ。
割といい感じにきれいになったんじゃないでしょうか。

次に以下で試してみます。

<div><a href="#1">aaa<div><a href="#2">bbb</div>

結果

<div>
 <a href="#1">aaa</a>
 <div>
  <a href="#1"></a>
  <a href="#2">bbb</a>
 </div>
</div>

お、おう。
ちょっと、ちょっと変だな。

そんなかんじで意地悪しすぎるとちょっと想定外の挙動をしますが、ある程度の良識あるちょっと間違っちゃったてへぺろ程度のコードであれば割とよろしくやってくれそうです。べんりですね。

スポンサーリンク