こんにちは。 エキサイト株式会社の三浦です。
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などを使っている場合、こんな形式はあまりに可読性が低いと言わざるを得ません。 PHPのsmartyと呼ばれるテンプレートエンジンであればstripというタグを使うことができるのですが、Thymeleafにはそのような機能はありません。
そこで、今回はこの strip
の機能を参考に、不要なスペース・改行削除処理を自作してみました。
スペース・改行削除処理
strip
の機能は、
各行の先頭と終端にある 余分なホワイトスペースやキャリッジリターンが除去されます。
というものです。 つまり、
- 改行文字ごとにHTMLを分解し、
- それぞれを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にデフォルトで削除機能がないのは、ある意味当然と言えます。
可能であれば、そもそもこれらのスペース・改行を気にせずに済むような状態にコードを変更することを優先し、どうしようもない場合のみ今回のコードの使用を検討してみてもらえると良いかと思います。