W.I.S. Laboratory
menu-bar

Windows PHP


PHPで改行コードを置換したいのに何かおかしい

フロントエンドがWindowsネイティブで、バックエンドがPHP、というアプリケーションを作っていたときの話。
開発環境(デバッグ用)のため、Windows10にWebサーバーを立てて、PHPが動作するようにした。
そのPHP上で、改行コード「\n」を他の文字に置換するコードを書いた。
ローカル上でフロントエンド側から送ったテキストデータをバックエンド側(PHP)で受け取り、正常に改行コードの置換が行えることを確認し、PHPコードを本運用環境へアップロードした。
するとフロントエンド側から送ったテキストデータ内にある改行コードが正常に置換できなくなってしまった。
バックエンドの運用環境はLinux系OSを採用したサーバーだった。
なぜこのようなことが起きたのか、いろいろやってみて原因が分かり解決したので備忘録。

Windows版PHPでの改行は「\n」と記述するのでLFのみの1バイトのように錯覚してしまうが、Windows系OSの改行は「\r\n」なので内部ではCRLFの2バイトになっている。
フロントエンド(Windows側)のテキストデータ内に改行が含まれていた場合、2バイトのCRLFがそのまま送られる。
バックエンドでこのデータを受け取り、例えばpreg_match関数を使って「\n」にマッチするようなコードを書くと、Windows版PHPだと実際は「\r\n」と比較するのでCRLFに正常にマッチして置換できるのだが、Linux版PHPはLFの「\n」単体にマッチしてしまうためCR分の「\r」が残ってしまう。
なので「\r\n」にマッチするように書き直すと、Linux版PHPでは正常に置換できるようになる。
しかしこうすると今度はWindows版PHPで「\r\r\n」と解釈してしまうため、マッチしなくなってしまう。
ジレンマだ。
最終的に正規表現を使い「\r?\n」にマッチするように書くと、両版のPHPで置換できるようになった。

[ 戻る ]
saluteweb