「改行コード」タグアーカイブ

(PHP) 文字列から改行を削除(または置き換え)するときの方法と比較

文字列から改行を削除します。

ご存じの通り、改行コードはUnix系がLF(\n)のみ、DOS系(Windows系)がCR+LF(\r\n)、Mac系がCR(\r)のみとなっています。

PHPでこれらを置換しよう思った場合、改行コードがいずれか一つであることが明確なら良いのですが、なかなかそうはいきません。

置換に使う関数はいくつかありますが、str_replaceとmb_ereg_replaceを比較しました。str_replaceは文字列の単純な置換を、mb_ereg_replaceはマルチバイト対応、正規表現で一致する文字列の置換を行います。

改行の消去と置換では微妙にコードに違いが出ますが、今回は半角スペースに置換しました。

比較したコードは以下の通りです。

//元の文字列:$original

//#1 mb_ereg_replace 一つずつ置換
$str1 = mb_ereg_replace("\r\n","\n",$original); //CR+LFをLFに
$str1 = mb_ereg_replace("\r","\n",$str1); // CRをLFに
$str1 = mb_ereg_replace("\n"," ",$str1);//LFを半角スペースに

//#2 mb_ereg_replace 3通りを置換
$str2 = mb_ereg_replace("\r\n|\n|\r"," ",$original);

//#3 str_replace 一つずつ置換
$str3 = str_replace("\r\n","\n",$original); //CR+LFをLFに
$str3 = str_replace("\r","\n",$str3); // CRをLFに
$str3 = str_replace("\n"," ",$str3);//LFを半角スペースに

//#4 str_replace 3通りを置換
$str4 = str_replace(array("\r\n","\n","\r")," ",$original);

同じ文章(約40KB)を1000回ほど置き換え、時間を計測しました。文字列の置換結果はいずれも同じですが、かかった時間はかなり違いました。
#1 : 0.92秒
#2 : 0.30秒
#3 : 0.11秒
#4 : 0.09秒

やはりstr_replaceは高速です。正規表現は汎用性も高く便利な機能ですが、時間はどうしてもかかってしまいます。mb_str_replaceのような関数が標準であると便利だと思います。

CoreserverのCron用スクリプトの改行に注意

CoreserverのCronを新しく設定したらエラーが返ってくるので悩んでいたら改行コードが原因でした。Coreserverでは管理設定から、アップロードしたCron用のスクリプトファイル(.shなど)を設定しますが、このスクリプトファイルを更新した際にミスがありました。

エラーは「No such file or directory Status: 404 Not Found Content-type: text/html No input file specified.」などと出ます。ちなみにこれはcdコマンドの行です。

改行コードがWindowsやMS-DOSで一般的なCR+LFになっていたので、Unix系のLFのみにしたところ、エラーはなくなりました。

セミコロンなどで1行を認識するスクリプトでは、改行コードはさしたる問題にはならないことが多いのですが、改行をもって1行を表す際には改行コードにも注意が必要です。