「<br> を改行に戻す」とは何をしているのか
前回は「改行を <br> に変換」でした。
今回はその逆、つまり
HTML の
<br>を、テキストの「改行文字(\nなど)」に戻す
という処理です。
例えば、画面表示用にこんな HTML を持っているとします。
$html = "1行目<br>2行目<br>3行目";
PHPこれを「テキストエリアに再表示したい」「プレーンテキストとして保存したい」といったときには、<br> のままだと扱いづらいので、
1行目
2行目
3行目
のように「改行文字」に戻したくなります。
それが「<br> を改行に戻す」ユーティリティの役割です。
どんな場面で必要になるのか
HTML を編集フォームに戻したいとき
よくあるのが、「一度 HTML として保存した内容を、再度テキストエリアで編集させたい」というケースです。
保存時はこうしていたとします。
// 入力:テキストエリア
$text = $_POST['body'] ?? '';
// 改行を <br> に変換して保存
$html = nl2br(htmlspecialchars($text, ENT_QUOTES, 'UTF-8'), false);
// $html を DB に保存
PHP次に「編集画面」を開くとき、DB から取り出した $html をそのままテキストエリアに入れると、こうなります。
// ダメな例
$value = $html; // "1行目<br>2行目<br>3行目"
PHPテキストエリアには <br> という文字列が見えてしまい、ユーザーにとってはとても編集しづらい状態です。
ここで必要になるのが、
「
<br>を改行文字に戻してから、テキストエリアに入れる」
という処理です。
HTML をプレーンテキストとして扱いたいとき
HTML で保存している本文を、
「メールのプレーンテキスト版にしたい」「ログにテキストとして残したい」といった場面でも、
<br>を改行に戻す- さらにタグを除去する
という流れがよく使われます。
基本パターン:str_replace で <br> を \n に変換
一番シンプルな書き方
まずは、いちばん素直なパターンから。
$html = "1行目<br>2行目<br>3行目";
$text = str_replace('<br>', "\n", $html);
echo $text;
/*
1行目
2行目
3行目
*/
PHPstr_replace は「文字列の置換」をする関数です。
- 探す文字列:
'<br>' - 置き換える文字列:
"\n"(LF の改行) - 対象:
$html
という指定をしています。
<br> のバリエーションに注意する
実務では、<br> にはいくつかの書き方が混ざります。
<br>
<br/>
<br />
<BR>
<Br>
などです。
これらを全部まとめて扱いたい場合は、str_replace を複数回呼ぶか、配列でまとめて指定します。
$html = "1行目<br>2行目<BR />3行目<br/>4行目";
$text = str_replace(
['<br>', '<br/>', '<br />', '<BR>', '<BR/>', '<BR />'],
"\n",
$html
);
echo $text;
PHPこれで、よくある <br> の書き方は一通り「改行」に戻せます。
正規表現で「<br> っぽいもの全部」をまとめて置換する
preg_replace を使った柔軟なパターン
<br> の書き方がバラバラでも、まとめて扱いたいときは正規表現が便利です。
$html = "1行目<br>2行目<BR />3行目<br/>4行目";
// <br> / <br/> / <br /> / 大文字小文字混在 などを全部対象にする
$text = preg_replace('/<br\s*\/?>/i', "\n", $html);
echo $text;
PHPこの正規表現の意味をかみ砕くと、こうなります。
<brで始まる- そのあとに任意の空白(
\s*)があってもよい - そのあとに
/があってもなくてもよい(\/?) >で終わるiフラグで大文字小文字を区別しない(<BR>も対象)
つまり、
<br>
<br/>
<br />
<BR>
<BR/>
<BR />
のようなパターンを全部「改行」に置き換えられます。
実務での具体的なシチュエーション例
例題1:保存済み HTML をテキストエリアに戻す
「改行を <br> に変換して保存している」パターンからの逆変換です。
保存時(新規登録時)はこうしていたとします。
// 入力(テキストエリア)
$raw = $_POST['body'] ?? '';
// 改行を <br> に変換して保存用 HTML を作る
$safe = htmlspecialchars($raw, ENT_QUOTES, 'UTF-8');
$html = nl2br($safe, false); // <br> で保存
PHP編集画面でテキストエリアに戻すときは、こうします。
// DB から取り出した HTML
$html = $row['body_html'];
// 1. <br> を改行に戻す
$text = preg_replace('/<br\s*\/?>/i', "\n", $html);
// 2. htmlspecialchars したものを戻す(エンティティを元に戻す)
$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
// 3. テキストエリアの value に入れる
?>
<textarea name="body"><?= htmlspecialchars($text, ENT_QUOTES, 'UTF-8') ?></textarea>
<?php
PHPここでのポイントは少し多いですが、重要なので整理します。
- 保存時に
htmlspecialcharsしているので、編集時にはhtml_entity_decodeで元に戻す。 <br>を改行に戻すのは「テキストとして編集しやすくするため」。- 最後にテキストエリアに埋め込むときは、再度
htmlspecialcharsして「HTML として安全に」出力する。
この流れを理解できると、「HTML とテキストを行き来する」処理が一気に怖くなくなります。
例題2:HTML 本文からプレーンテキスト版を作る
HTML で保存している本文から、「プレーンテキスト版」を作りたいケースです。
$html = '<p>こんにちは。<br>本日はご来店ありがとうございます。</p>';
PHPこれを、
こんにちは。
本日はご来店ありがとうございます。
のようなテキストにしたいとします。
// 1. <br> を改行に戻す
$text = preg_replace('/<br\s*\/?>/i', "\n", $html);
// 2. 残りの HTML タグを除去
$text = strip_tags($text);
// 3. 前後の空白や改行を整える
$text = trim($text);
echo $text;
PHPこのように、
<br>を改行に変換- それ以外のタグは
strip_tagsで削除
という順番にすると、「改行を保ったままテキスト化」できます。
重要ポイントの深掘り
「どの改行コードにするか」を自分で決める
<br> を「どの改行コードに戻すか」は、自分で決める必要があります。
一般的には LF(\n)で十分です。
"\n" // Linux / macOS などで標準的
PHPWindows 向けのテキストファイルを作りたいなど、特別な理由がある場合は CRLF(\r\n)にしても構いません。
$text = preg_replace('/<br\s*\/?>/i', "\r\n", $html);
PHP大事なのは、
「自分のシステムの中では、改行は基本的にこれで統一する」
というルールを決めておくことです。
HTML エスケープとの関係を整理しておく
「<br> を改行に戻す」ときに、よく混乱するポイントがここです。
- 画面に「HTML として」出すとき
→htmlspecialcharsしてからnl2brするのが基本。 - テキストとして「編集させる/保存する」とき
→<br>を改行に戻し、必要に応じてhtml_entity_decodeでエンティティも戻す。
つまり、
- 表示側:テキスト → エスケープ →
<br>に変換 - 編集側:
<br>を改行に戻す → エンティティを戻す → テキストエリアに入れる
という「行き」と「帰り」の流れをセットで理解しておくと、迷いにくくなります。
まとめ:今日から使える「<br> を改行に戻す」テンプレ
一番汎用的で実務的な関数を、最後にまとめておきます。
/**
* HTML の <br> を改行コードに戻すユーティリティ。
* よくある <br> のバリエーション(<br>, <br/>, <br /> など)をまとめて扱う。
*/
function brToNewline(string $html, string $newline = "\n"): string
{
return preg_replace('/<br\s*\/?>/i', $newline, $html);
}
PHP使い方のイメージはこうです。
$html = "1行目<br>2行目<BR />3行目";
$text = brToNewline($html); // デフォルトは "\n"
echo $text;
/*
1行目
2行目
3行目
*/
PHP
