元となる文章はブログなどに書かれている長い文章ですが、メルマガで読みやすくするために1行全角30文字(半角60文字)ぐらいで自動的に改行を入れたいです。
mb_strlenやmb_substrで文字数を数えて、どこからどこまでを区切るというロジックを書こうとしましたが、文章の中に半角文字も含まれるため、文字数という概念で改行を入れると1行の文字数がそろっているように見えません。
一方バイト数で数えて文字を切っても、全角文字1文字が半分に区切られてしまっては読めなくなってしまいます。
それを解決するための関数やライブラリ、またはサンプルソースがあれば教えてください。
<?php function my_format($str, $width) { $ce = mb_internal_encoding() ; mb_internal_encoding(mb_detect_encoding($str)) ; if ($width <= 0) return $str ; for ($ret = '', $i = 0; $seg = mb_strimwidth($str, $i, $width); $i += mb_strlen($seg) + ($seg == '')) $ret .= ($seg = preg_replace('/(\r?\n).*/', '$1', $seg)).(preg_match('/[\r\n]$/', $seg) ? '' : "\n") ; mb_internal_encoding($ce) ; return $ret ; } $str = 'PHPでメルマガ用の原稿を作成しようとしています。 元となる文章はブログなどに書かれている長い文章ですが、メルマガで読みやすくするために1行全角30文字(半角60文字)ぐらいで自動的に改行を入れたいです。 mb_strlenやmb_substrで文字数を数えて、どこからどこまでを区切るというロジックを書こうとしましたが、文章の中に半角文字も含まれるため、文字数という概念で改行を入れると1行の文字数がそろっているように見えません。 一方バイト数で数えて文字を切っても、全角文字1文字が半分に区切られてしまっては読めなくなってしまいます。 それを解決するための関数やライブラリ、またはサンプルソースがあれば教えてください。' ; echo '<pre>' .my_format($str, 60) .'</pre>' ; ?>
出力例
PHPでメルマガ用の原稿を作成しようとしています。 元となる文章はブログなどに書かれている長い文章ですが、メルマ ガで読みやすくするために1行全角30文字(半角60文字)ぐらいで 自動的に改行を入れたいです。 mb_strlenやmb_substrで文字数を数えて、どこからどこまでを区切 るというロジックを書こうとしましたが、文章の中に半角文字も含 まれるため、文字数という概念で改行を入れると1行の文字数がそ ろっているように見えません。 一方バイト数で数えて文字を切っても、全角文字1文字が半分に区 切られてしまっては読めなくなってしまいます。 それを解決するための関数やライブラリ、またはサンプルソースが あれば教えてください。
mb_strimwidthという関数が便利。
以下に折り返し関数の例を示します。1行分(改行コードを含まず)を折り返し処理するものです。内部処理は EUC-JP を用いています。
/** * 文字列を整形して返す(1行分) * @param String $str 折り返したい文字列(SJIS,EUC-JP,UTF-8) * @param int $width 折り返す桁数(半角1文字を1桁とする、0なら折り返さない) * @return String 整形後の文字列(EUC-JP、最後に改行文字を付加) */ function my_format($str, $width) { mb_internal_encoding('EUC-JP'); $str = mb_convert_encoding($str, 'EUC-JP', 'SJIS,EUC-JP,UTF-8'); //折り返さない if ($width <= 0) { $dest = $str . "\n"; //折り返す } else { $dest = ''; $w = 0; $l = mb_strlen($str); for ($i = 0; $i < $l; $i++) { $ch = mb_substr($str, $i, 1, 'EUC-JP'); $dest = $dest . $ch; if ($ch == "\n") $w = 0; else $w += mb_strwidth($ch); if ($w > $width) { $w = 0; $dest = $dest . "\n"; } } $dest = $dest . "\n"; } return $dest; }
ありがとうございます!早速ソースまで見せていただき助かります!
後で実装して試してみます。
<?php function my_format($str, $width) { $ce = mb_internal_encoding() ; mb_internal_encoding(mb_detect_encoding($str)) ; if ($width <= 0) return $str ; for ($ret = '', $i = 0; $seg = mb_strimwidth($str, $i, $width); $i += mb_strlen($seg) + ($seg == '')) $ret .= ($seg = preg_replace('/(\r?\n).*/', '$1', $seg)).(preg_match('/[\r\n]$/', $seg) ? '' : "\n") ; mb_internal_encoding($ce) ; return $ret ; } $str = 'PHPでメルマガ用の原稿を作成しようとしています。 元となる文章はブログなどに書かれている長い文章ですが、メルマガで読みやすくするために1行全角30文字(半角60文字)ぐらいで自動的に改行を入れたいです。 mb_strlenやmb_substrで文字数を数えて、どこからどこまでを区切るというロジックを書こうとしましたが、文章の中に半角文字も含まれるため、文字数という概念で改行を入れると1行の文字数がそろっているように見えません。 一方バイト数で数えて文字を切っても、全角文字1文字が半分に区切られてしまっては読めなくなってしまいます。 それを解決するための関数やライブラリ、またはサンプルソースがあれば教えてください。' ; echo '<pre>' .my_format($str, 60) .'</pre>' ; ?>
出力例
PHPでメルマガ用の原稿を作成しようとしています。 元となる文章はブログなどに書かれている長い文章ですが、メルマ ガで読みやすくするために1行全角30文字(半角60文字)ぐらいで 自動的に改行を入れたいです。 mb_strlenやmb_substrで文字数を数えて、どこからどこまでを区切 るというロジックを書こうとしましたが、文章の中に半角文字も含 まれるため、文字数という概念で改行を入れると1行の文字数がそ ろっているように見えません。 一方バイト数で数えて文字を切っても、全角文字1文字が半分に区 切られてしまっては読めなくなってしまいます。 それを解決するための関数やライブラリ、またはサンプルソースが あれば教えてください。
mb_strimwidthという関数が便利。
mb_strimwidthという関数、初めて知りました。便利ですね!
ありがとうございます。
mb_strimwidthという関数、初めて知りました。便利ですね!
ありがとうございます。