laravel5.1(PHP)で、テキストエリアの文字列を表示時に指定文字数で改行する方法
元のテキストエリアで改行を入れずに延々と書き続けると、ブラウザに横スクロールバーが出るくらい表示されてしまった!
word_wrapという関数があるけど、英数字しか対応してないので、UTF-8などマルチバイトでは、途中でぶった切られて役に立たない…。
とりあえず、PHPだけで対応してみた。
1, テキストエリアの文字列を取得
2, 各行に切り出して、配列に格納
3, n行目が指定の長さ以下なら何もしない
3, n行目が指定の長さ以上なら、指定の長さで分割
4, 最後に、改行コードで配列を結合して完成
えらい、泥臭いコーディングになってしまった…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$str = "テスト用に長い文字列。 012345678901234567890123456789 012345678901234567890123456789 012345678901234567890123456789 012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 "; $width=35; // 改行させたい文字列 $break=PHP_EOL; // 改行コード // 改行毎に配列に分ける $str_lines = explode("\n", $str); // PHP_EOLだとダメだったので\nを使用 $arr_result_line = []; //各行ごとに処理 for($i_line=0; $i_line < count($str_lines); $i_line++){ // n行の文字列を取得 $this_line = $str_lines[$i_line]; // n行目の長さを計測(マルチバイト対応) $str_line_len = mb_strlen($this_line); // 指定された長さ以下なら、代入するだけで何もしない if($width >= $str_line_len){ $arr_result_line[] = $this_line; continue; } // 指定より長かったら、各行が指定の長さで切り出す for ($i=0; $i<=$str_line_len; $i+=$width) { $arr_result_line[] = mb_substr($this_line, $i, $width); } } // 配列を改行で結合して、出来上がり! $result_str = implode($break, $arr_result_line); |
文字数だけでカウントしているので、
1, すべて半角文字の行
2, すべて全角文字の行
だと、結構な差があるな~。まあ、カーニング(文字によって横幅が違う。lとZ)の問題もあるし、完全一致は無理だな。