PHP Tips | 文字列処理:基本操作 – <br> を改行に戻す

PHP PHP
スポンサーリンク

「<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行目
*/
PHP

str_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

ここでのポイントは少し多いですが、重要なので整理します。

  1. 保存時に htmlspecialchars しているので、編集時には html_entity_decode で元に戻す。
  2. <br> を改行に戻すのは「テキストとして編集しやすくするため」。
  3. 最後にテキストエリアに埋め込むときは、再度 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

このように、

  1. <br> を改行に変換
  2. それ以外のタグは strip_tags で削除

という順番にすると、「改行を保ったままテキスト化」できます。


重要ポイントの深掘り

「どの改行コードにするか」を自分で決める

<br> を「どの改行コードに戻すか」は、自分で決める必要があります。

一般的には LF(\n)で十分です。

"\n"  // Linux / macOS などで標準的
PHP

Windows 向けのテキストファイルを作りたいなど、特別な理由がある場合は 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

タイトルとURLをコピーしました