キャリッジリターン(CR)の文字コード(0x0D)やラインフィード(LF)の文字コード(0x0A)から文字列としての"\r", "\n"に変換するのは特に問題はないと思います。
問題は逆方向で、\nという文字列をLFという文字に変換したいとき、str_replace('\\n',"\n",$text)みたいにやるとやっぱ恥ずかしいですよね。
\\nという文字列で、エスケープしたつもりのデータが埋もれているかもしれません。
\\nという文字列のつもりが0x5C(\),0x0A(LF)になってしまっては悲しいです。
そこで、とりあえず以下のようにするのはいかがでしょう。
$text= preg_replace( '/(?<!\\\\)\\\\n/', "\n", $text );
\マークだらけでうんざりしますね。phpで正規表現を扱う者への呪いです。
何がしたいのかというと、$text変数内に\\nという文字列でなく、\nという文字列があったらLF文字(0x0a)に変換するという祈りを込めています。
(?<!\\\\) というのは否定後読みといって\\\\というパターンがない場合にマッチします。phpでは\\\\というパターンは\という「文字」にマッチします。呪いでしょう?
ついでに、\\\\nは\\\nと同じ意味を持ちます。まさに呪いです。
以上は前記事でデータベースをmysqlからsqlite3に移行した際に得たネタです。
何が恥ずかしいと言いますと、phpをたまに触って正規表現を使用するたびに\\\\のことをすっかり忘れているからです。
そこで、恥ずかしながら記録として残しておきたいと思います。とりあえずはデータベースのデータ内ではエスケープ文字としての\を特別扱いする必要はないので、この程度で申し訳ございません。
くだらない駄文をお読みいただいてありがとうございました。
0 件のコメント:
コメントを投稿