- ベストアンサー
PHPで任意の数の行抽出
PHPで下記のような文字列がありますが、 この文字列から先頭2行抽出して画面に表示したいのですが、 調べてみてもいい例がありませんでした。 各3種類の改行コードからの各先頭2行抽出方法です。 $a="文字列1\r\n文字列2\r\n文字列3\r\n"; $b="文字列1\r文字列2\r文字列3\r"; $c="文字列1\n文字列2\n文字列3\n";
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
preg_split を使えば、区切り文字を正規表現で指定して文字列の配列への分解ができます。 <?php $a="文字列1\r\n文字列2\r\n文字列3\r\n"; $b="文字列1\r文字列2\r文字列3\r"; $c="文字列1\n文字列2\n文字列3\n"; foreach (array($a,$b,$c) as $str) { $array = preg_split('/\r\n|\r|\n/', $str); print $array[0].",".$array[1]."<br>\n"; } ?> あと、前の方の回答ですが、preg_split 一発で出来るものを preg_replaceしてからexplodeしているという無駄なのもさておき、preg_replace の引数もあまり普通の使い方になっていません。 preg_replaceで'[\r\n|\r|\n]'を指定していますが、これは'/\r\n|\r|\n/'と同じ意味で、 正規表現としては「\r\n|\r|\n」つまり『「\r\n」か「\r」か「\n」』という指定です。 (PCREでは、先頭と最後に正規表現のセパレータ文字を指定します。通常は'/'で始めて'/'で終わるのが一般的ですが、'{'~'}'などの括弧開き~括弧閉じも指定できます。 つまり、先頭の'['と末尾の']'は正規表現としては無視されて、その中身の「'\r\n|\r|\n」が正規表現としての指定になります。) もし正規表現としての「[\r\n|\r|\n]」を指定すると、これは『「\r」か「\n」か「|」か「\r」か「|」か「\n」』という全く異なり意味になりますのでご注意ください。
その他の回答 (3)
- bm_hiro
- ベストアンサー率51% (200/388)
基本的に やり方は一緒ですが、「区切り文字」を作るというだけなら nl2br を使うのも手かと思います。 まぁ、やってみたら うまくいきませんでしたが、理論上は ↓の例3の通りかと。 http://php.net/manual/ja/function.nl2br.php
mtaka2さんの回答で申し分ないですが、1点だけ補足。 「バックスラッシュの後ろがエスケープ対象になる文字じゃなければ『\』1つでバックスラッシュ自体を表す」ことが出来る言語がPHPぐらいなんですよね。 多くの言語ではバックスラッシュ自体を表したければ、如何なる場合も『\\』としなければなりません。 たとえば printf("[a]\[b]"); これはPHPでは [a]\[b] と表示されますが、C言語では [a][b] と無視されて表示されます。 Javaでは System.out.println("[a]\[b]"); はコンパイルエラーになります。 今回の場合は "\n" でも "\\n" でも '\n' でも '\\n' でも大差ないですが、「\s」が絡んでくるときだけややこしいので覚えておいてください。 http://note.chiebukuro.yahoo.co.jp/detail/n149597
- blue-goheimochi
- ベストアンサー率72% (39/54)
各先頭2行ということなので、 「文字列1」と「文字列2」が抽出されるという解釈でOKでしょうか?? その前提で以下のようなコードを書いてみました。 --------------------------------------------------- $a="文字列1\r\n文字列2\r\n文字列3\r\n"; $b="文字列1\r文字列2\r文字列3\r"; $c="文字列1\n文字列2\n文字列3\n"; // 改行コードで行ごとに分割する関数 function splitByNL( $txt ) { // 改行コードを一度「,」(カンマ)に全て置き換え $tmpTxt= preg_replace("[\r\n|\n|\r]", ",", $txt); // 「,」で配列に分解 $txtArray = explode(',', $tmpTxt); return $txtArray; } $aArray = splitByNL($a); echo $aArray[0]; //1行目をecho echo $aArray[1]; //2行目をecho $bArray = splitByNL($b); echo $bArray[0]; //1行目をecho echo $bArray[1]; //2行目をecho $cArray = splitByNL($c); echo $cArray[0]; //1行目をecho echo $cArray[1]; //2行目をecho --------------------------------------------------- 3行目のデータは削除している訳ではないので、 echo $aArray[2]; のようにechoすれば、3行目のデータが表示されるような形です。