記事カテゴリ:
シリーズ記事一覧:
やりたいこと:PHPの正規表現で文書にある改行(\n)記号をHTMLタグ(<br>)に変換
- 環境:PHP5.6
- Windows上でテキストエディターに認識される改行記号(\n)が入っている文書
- 文字列1\n文字列2 <- 「文字列1」と「文字列2」の間に改行記号(\n)があります
- PHPの正規表現でこの改行記号(\n)をHTMLタグ(<br>)に変換します
$str = "文字列1\n文字列2"; echo preg_replace( "/\\n/u","<br>", $str ); // 結果➡ 文字列1<br>文字列2
- ここで正規表現のパターン: "/\\n/" で改行記号(\n)を認識します
問題点:文字列を シングルクォーテーション で囲んでpreg_replaceに渡すと違う結果になります
- 同じ上記の例で文字列をシングルクォーテーションで囲みます
$str = '文字列1\n文字列2'; echo preg_replace( "/\\n/u","<br>", $str ); // 結果➡ 文字列1\n文字列2
- 結果は何も変わってないです(変換されませんでした)
文字列を シングルクォーテーション で囲んでいる場合に正規表現のパターンは四つのバックスラッシュ("/\\\\n/")が必要となります
- 上記例でうまく動作させるには正規表現のパタンに四つのバックスラッシュ("/\\\\n/")が必要となります
$str = '文字列1\n文字列2'; echo preg_replace( "/\\\\n/u","<br>", $str ); // 結果➡ 文字列1<br>文字列2
- ちなみに、シングルクォーテーション/ダブルクォーテーションで囲んでいた文字列とそれぞくのマッチパタンを以下のよう
$str = "文字列1\n文字列2"; echo preg_replace( "/\\n/u","<br>", $str ); // 結果➡ 文字列1<br>文字列2 $str = "文字列1\n文字列2"; echo preg_replace( "/\\\\n/u","<br>", $str ); // 結果➡ 文字列1 // 文字列2 $str = '文字列1\n文字列2'; echo preg_replace( "/\\n/u","<br>", $str ); // 結果➡ 文字列1\n文字列2 $str = '文字列1\n文字列2'; echo preg_replace( "/\\\\n/u","<br>", $str ); // 結果➡ 文字列1<br>文字列2
PHPで文字列を扱うときにシングルクォーテーション/ダブルクォーテーションの統一が必要となります
- シングルクォーテーション/ダブルクォーテーションを手軽に使うことができますが、気を付けないと大きな問題になります
関連記事一覧
PHPの正規表現の改行(\n)識別に注意すること
問題点:PHPの正規表現で改行記号(\n)をうまく識別できない
- 以下のPHPコード(preg_split)改行記号(\n)をうまく認識しない
$split_arr = preg_split('/[ ;;,,、\n\t]+/ui', ' ' . $str); var_dump($split_arr);
- 実行結果は以下のようで
array(7) { [0] => string(0) "" [1] => string(6) "午前" [2] => string(6) "午後" [3] => string(3) "昼" [4] => " [5] => " [6] => string(6) "学習" }
- 改行記号:「\n」だけては正規表現が認識しない
正規表現で改行を「\r\n」で認識すべきです
- ASCII文字コードではOSより改行コードが違います
- LF(改行、0x0A):主にUnix、Linuxで使用
- CR (復帰、0x0D) :主にAppleのMaxOSで使用
- CR+LF:主にWindowsで使用
- 使用OSより、改行記号が違うため、すべての改行記号を対応する正規表現が必要となります
- 改行記号:「\r\n」を利用すれば各OSに対応できます: preg_split('/[ ;;,,、\r\n\t]+/ui', ' ' . $str)
コメントを追加