これはメモです

それ以上でもそれ以下でもないのです

PHP シングルクォーテーションとダブルクォーテーションの違いにハマる

悔しいので備忘としてメモ。

以下のような文字列の改行をhtmlの<br>に変換したくnl2br()を使用したものの、 もともとあった改行が削除されない。

<?php
// <textarea>などで入力されたテキストとお考えください
$text = <<<EOL
あいうえお
かきくけこ
EOL;
var_dump(nl2br($text, false));

出力

string(35) "あいうえお<br>
かきくけこ"

これではhtmlとして表示された際に余分なスペースが空いてしまうことになる。 そのためstr_replace()を使用して改行を削除しようとしたのだが…

<?php
$text = <<<EOL
あいうえお
かきくけこ
EOL;

$newText = nl2br($text, false);
$newText = str_replace(['\r\n', '\r', '\n'], '', $newText);
var_dump($newText);

出力

string(35) "あいうえお<br>
かきくけこ"

結果が何も変わらず、依然として改行文字が残り続けている状態。 結果として、改行文字をくくるのにシングルクォーテーションを使っていることが原因だった。

// \nの場合
シングル -> 単なる \n という文字列として扱う
ダブル -> 改行文字として扱う

php.netにも記載がある。

文字列を指定する最も簡単な方法は、引用符 (文字 ') で括ることです。(中略) \r や \n といったおなじみのエスケープシーケンスを書いても特別な効果は得られず、 書いたままの形式で出力されます。

www.php.net

シングルクォーテーションをダブルクォーテーションに変更して試してみる。

<?php
$text = <<<EOL
あいうえお
かきくけこ
EOL;

$newText = nl2br($text, false);
- $newText = str_replace(['\r\n', '\r', '\n'], '', $newText);
+ $newText = str_replace(["\r\n", "\r", "\n"], '', $newText);
var_dump($newText);

出力

string(34) "あいうえお<br>かきくけこ"

無事、改行文字を削除することができた。

シングルクォーテーションとダブルクォーテーションの違いは変数展開ができる・できないくらいの認識だったので勉強になった。

でも少ないとはいえ時間を溶かしてしまったので悔しい。

【参考】