なぜ「改行を除去した1行化」が必要になるのか
業務で文字列を扱っていると、
「中身はそのままでいいから、とにかく“1行の文字列”にしたい」
という場面がよく出てきます。
ログに出すときに、改行があると見づらい。
CSV や TSV の 1 セルに入れたいが、改行があるとフォーマットが壊れる。
画面の一覧表示で、1 行に収めたい。
こういうときにやるのが「改行を除去した1行化」です。
やること自体はシンプルで、「改行文字を全部取り除く」か「別の文字に置き換える」だけですが、
どの改行コードを対象にするか、何に置き換えるかをきちんと決めておくのがポイントです。
改行コードの種類をざっくり押さえる
実は「改行」は1種類じゃない
テキストの改行には、主に次の 3 パターンがあります。
\n… LF(Unix 系、Linux・macOS など)\r\n… CRLF(Windows)\r… CR(古い Mac など、ほぼ見ないがゼロではない)
外部システムから来たデータや、ユーザーが貼り付けたテキストには、
これらが混ざっていることがあります。
「改行を除去する」ユーティリティを作るときは、
基本的にこの 3 つ全部を対象にする、と決めておくと安心です。
コアとなる関数:改行を全部取り除いて1行にする
一番シンプルな「完全除去」版
まずは、「改行を完全に消して、文字を詰める」パターンです。
/**
* 文字列から改行をすべて除去して 1 行の文字列にする
*/
function to_single_line(string $value): string
{
// \r\n, \r, \n をすべて空文字に置き換える
return str_replace(["\r\n", "\r", "\n"], '', $value);
}
PHP使い方の例です。
$text = "1行目\n2行目\r\n3行目\r4行目";
echo to_single_line($text);
// 出力: 1行目2行目3行目4行目
PHPここでの重要ポイントは、「置き換える順番」と「対象」です。
\r\n を先に置き換えることで、"\r\n" が「\r と \n に分かれて二重に処理される」ことを防いでいます。
そのあとで残りの \r と \n をまとめて消す、という流れです。
改行を「スペースに変える」版もよく使う
完全に詰めると読みにくい場合
さっきの例だと、1行目2行目3行目4行目 のように、
行と行の境目が分からなくなります。
ログや画面表示では、「改行は消したいけど、区切りは残したい」ことも多いです。
その場合は、改行を空文字ではなく「スペース」に置き換えます。
/**
* 改行をスペースに変えて 1 行の文字列にする
*/
function to_single_line_with_space(string $value): string
{
// まず \r\n, \r, \n をすべてスペースに
$value = str_replace(["\r\n", "\r", "\n"], ' ', $value);
// スペースが連続した場合は 1 個にまとめる(お好みで)
$value = preg_replace('/\s+/', ' ', $value);
// 前後の空白をトリム
return trim($value);
}
PHP使い方の例です。
$text = "1行目\n2行目\r\n3行目\r4行目";
echo to_single_line_with_space($text);
// 出力: 1行目 2行目 3行目 4行目
PHPここでのポイントは、「スペースが連続しないように整える」ことです。
改行が連続していた場合などに、" " のような二重スペースができるのを防げます。
実務での使いどころのイメージ
ログ出力の前処理として
例えば、ユーザー入力をログに残すとき、
改行があるとログファイルが見づらくなります。
$input = $_POST['comment'] ?? '';
$logMessage = to_single_line_with_space($input);
error_log('[comment] ' . $logMessage);
PHPこうしておけば、ログは常に「1 行 = 1 レコード」になり、
後から grep したり、ログビューアで追いかけるときに楽になります。
CSV/TSV の 1 セルに入れる前処理として
CSV や TSV に出力するとき、
セルの中に改行があると、読み込み側の実装によってはうまく扱えません。
「改行をスペースに変えて 1 行化してから CSV 用エスケープをかける」
というのは、実務でよくやるパターンです。
$comment = to_single_line_with_space($row['comment']);
$csvField = csv_escape_field($comment);
PHPまとめ:今日からの「改行を除去した1行化」ユーティリティ
ポイントを整理すると、こうなります。
改行コードは \r\n・\r・\n の 3 種類を意識する。
1 行化には「完全に詰める」と「スペースに置き換える」の 2 パターンがある。
ログや CSV/TSV 出力の前処理として使うと、後工程がかなり楽になる。
ユーティリティとしては、この 2 本を持っておくと使い分けしやすいです。
function to_single_line(string $value): string
{
return str_replace(["\r\n", "\r", "\n"], '', $value);
}
function to_single_line_with_space(string $value): string
{
$value = str_replace(["\r\n", "\r", "\n"], ' ', $value);
$value = preg_replace('/\s+/', ' ', $value);
return trim($value);
}
PHPもし、あなたのコードのどこかで「そのままログに改行入りの文字列を突っ込んでいる」「CSV に改行入りのコメントをそのまま入れている」ような箇所があれば、そこがこの 1 行化ユーティリティを差し込むベストポイントです。
たった数行の前処理で、「後から困らない文字列」に一気に変わります。
