ど素人から毛を生やす。<延>

phpで改行を置換したいが「\n」と「\r\n」の違いに首を傾げた話。

Web > PHP 2017年7月5日(最終更新:5月前)

どもです。
phpで改行を置換することになり、ちょっと悩んだのでメモ。

置換等を行う際、改行処理は制御文字を用いて行う必要があります。

が、

どうにも改行用の制御文字には「\n」と「\r\n」の2種類があるらしい。

で、この違いは何ぞやと調べてみたところ、
stack overflow にとても分かり易い回答があったので引用します。

\nはLF文字(Line Feed)、\rはCR文字(Carriage Return)と呼ばれる制御文字です。
テキストの改行を表現する方法は、システムによって下記3パターンが存在します。その表現方法が使われている代表的なOSも併記しています。

\n(LF):Unix系OS全般、Mac OS X
\r\n(CR+LF):Windows系OS
\r(CR):古いMac OS(9以前)

コンピュータ上の表現としては\n1文字で扱うのが自然ですが、もともとタイプライター由来で\r\nが利用されていたという歴史的経緯があります。(CRが印字装置を左端に戻す動作+LFが紙を1行分スクロールする動作)
yohjp

つまり、「\n」と「\r\n」のどちらもが正解で、、
しかしOSによってどちらを使えば良いか分かれるということ。

これは、単に開発環境のOSに合わせて置換処理を行えば良いという単純な答えじゃダメですな。

$string = str_replace("\r", "", $string);			// \rの除去
$string = str_replace("\n", "これに置換したいの", $string);	// 改行の置換

2回処理しとくのがベターですな。

もし古い\r単体で改行のパターンにも対応したいということになったら
\rを\nに置換すれば一応改行はできますな。
\rでないときに改行の回数がズレますが。

もしシステムの都合とかで二重改行はダメなんてことになったら
\rを置換した後にwhileで\n\nを\nに置換すればおkですな。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)