【PHP】改行コードを置換して配列に格納する

公開日:
更新日:
カテゴリー: PHP

PHPで改行コードを置換して、配列に格納する方法を説明しています。

改行コードの種類は3つあるので、それらを置換でどれか一つに統一することで配列に格納できるようになります。

改行コードの種類

フォームのテキストエリアに入力された文章をPOST送信で受け取り、改行コード(\n)で区切って一行ずつ配列に格納し、そのあとの処理を実行させようとしたのですがなかなかうまくいきませんでした。

原因を考えた結果、改行コードの種類にありました。

  • CRLF改行:\r\n
  • CR改行:\r
  • LF改行:\n

改行コードにはこれら3つがあり、この3つに対応させる処理を入れなければなりませんでした。

改行コードの置換

ということで、すべての改行コードを一旦LF改行コード(\n)に置換して、その後配列に格納する作戦を採りました。

改行コードの置換はstr_replace関数を使ってこのようにしました。

$str = str_replace(array("\r\n","\r","\n"), "\n", $str);

これで3つの改行コードをすべてLF改行コードに統一できます。

LF改行コードで区切って配列に格納

改行コードがすべてLF改行(\n)に置換されたので、あとは【PHP】指定文字で区切って配列に格納にあるようにexplode関数を使えばすっきりと配列に収まります。

$array = explode("\n", $str);

まとめると、次のようにすればよいです。

//改行コードを含む文字列
$str = "あああああ\r\nいいいいい\rううううう\nえええええ";

//改行コードを置換してLF改行コードに統一
$str = str_replace(array("\r\n","\r","\n"), "\n", $str);

//LF改行コードで配列に格納
$array = explode("\n", $str);

この場合、配列の中身は次のようになります。

Array
(
    [0] => あああああ
    [1] => いいいいい
    [2] => ううううう
    [3] => えええええ
)

追記

最初、改行コードの置換でシングルクォーテーションを用いて次のようにしていましたが、

$str = str_replace(array('\r\n','\r','\n'), '\n', $str);

これだと上手く動かないとコメントでご指摘がありました。

検証のため次のようにシングルクォーテーションを使って実験したところ、

//改行コードを含む文字列
$str = "あああああ\r\nいいいいい\rううううう\nえええええ";

//改行コードを置換してLF改行コードに統一
$str = str_replace(array('\r\n','\r','\n'), '\n', $str);

//LF改行コードで配列に格納
$array = explode("\n", $str);

確かに次のように改行コードの置換に失敗していました。

Array
(
    [0] => あああああ
    [1] => いいいいい
ううううう
    [2] => えええええ
)

この原因ですが、「シングルクォーテーション」と「ダブルクォーテーション」の微妙な(そして明確な)挙動の違いがあり、シングルクォーテーションは特殊文字(改行コードなど)を特殊文字と認識せず、文字列として処理するため置換そのものが上手くいっていませんでした。

そのため、当然ながらexplode関数で特殊文字をシングルクォーテーションで囲むと、

$array = explode('\n', $str);

「\n」をLF改行コード(特殊文字)として扱わず、文字列として扱うので上手く動きません。

詳しくは、【PHP】特殊文字をシングルクォーテーションで囲むのは危険!を参照してください。

 

あわせて読んでほしい!

 

コメント

1:匿名希望:2017/05/25 18:44:47

$str = str_replace(array('\r\n','\r','\n'), '\n', $str);
は、
$str = str_replace(array("\r\n","\r","\n"), "\n", $str);
でないと駄目だった。。

2:管理人:2017/05/25 23:08:16

検証したところ、シングルクォーテーションだと特殊文字(改行コード)は単なる文字列として扱われ、置換が上手くいかないことがわかりました。

「シングルクォーテーション」と「ダブルクォーテーション」の挙動の違いを意識してなかったミスでした。
ご指摘ありがとうございます!

コメントフォーム
お名前
コメント