JavaでHTMLの不要なスペース・改行を削除する

こんにちは。 エキサイト株式会社の三浦です。

JavaでHTMLを構築するとき、タグ間などに存在する不要なスペースや改行を消したいと思ったことはありませんか? 今回は、それらを削除する方法について説明します。

HTMLと不要なスペース・改行

例えば、以下のようなHTMLを作りたいとしましょう。

<div>
    <span>hello world!</span>
    <a href="https://sample/">sample site</a>
</div>

通常ならこれで問題ありませんが、それ以降のHTMLの整形処理などの関係で、不要なスペースや改行を削除したいと思ったことはありませんか? 上記のHTMLなら、以下のような状態にしたい、というものです。

<div><span>hello world!</span><a href="https://sample/">sample site</a></div>

ですが、例えばThymeleafなどを使っている場合、こんな形式はあまりに可読性が低いと言わざるを得ません。 PHPsmartyと呼ばれるテンプレートエンジンであればstripというタグを使うことができるのですが、Thymeleafにはそのような機能はありません。

そこで、今回はこの strip の機能を参考に、不要なスペース・改行削除処理を自作してみました。

スペース・改行削除処理

strip の機能は、

各行の先頭と終端にある 余分なホワイトスペースやキャリッジリターンが除去されます。

というものです。 つまり、

  1. 改行文字ごとにHTMLを分解し、
  2. それぞれをtrimする

事ができればいいわけです。

すなわち、以下の処理になります。

Pattern BREAK_PATTERN = Pattern.compile("\r\n|\r|\n");

String html = "整形したいHTML";
String strippedHtml = Arrays
    .stream(BREAK_PATTERN.split(html))
    .map(htmlLine -> htmlLine.trim())
    .collect(Collectors.joining());

ついでにタグ文字を取り除きたかったり、半角・全角スペースしか存在しない行は削除したいなどのカスタムな要望があれば、以下のように処理することもできます。

Pattern BREAK_PATTERN = Pattern.compile("\r\n|\r|\n");
Pattern TAB_PATTERN = Pattern.compile("\t");

String html = "整形したいHTML";
String strippedHtml = Arrays
    .stream(BREAK_PATTERN.split(html))
    .map(htmlLine -> TAB_PATTERN.matcher(htmlLine.trim()).replaceAll(""))
    .filter(htmlLine -> StringUtils.isNotBlank(htmlLine))
    .collect(Collectors.joining());

最後に

最初に書いたとおり、そもそもHTMLはこの程度のスペースや改行は気にする必要がないようにできています。 なので、Thymeleafにデフォルトで削除機能がないのは、ある意味当然と言えます。

可能であれば、そもそもこれらのスペース・改行を気にせずに済むような状態にコードを変更することを優先し、どうしようもない場合のみ今回のコードの使用を検討してみてもらえると良いかと思います。