DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. テキストを自動整形する簡易 CakePHP ヘルパー

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2014/10/25

テキストを自動整形する簡易 CakePHP ヘルパー

 

CakePHP 2.0 でいくつかシステムを作成したのだが、日本語対応のテキスト整形機能が乏しくて苦労している。

特に、動的に行長が変化するメールの文面などを一定幅で自動改行して整形したいことがよくある。これを CakePHP のヘルパーにしておけばいろいろ使いまわしができそうなので CakePHP 2 用のプラグインとして簡易ルールのものを作ってみた。

※禁則は行頭禁則のみ。禁則文字は「。」と「、」のみ。半角文字のみで構成される単語は1まとまりとみなし分割しない。禁則文字が複数連続する場合の処理は行っていない。

LambdaTools StringHelper Plugin (ZIP; 1,698 bytes)

CakePHP の {APP}/Plugin 配下に展開し、ヘルパー名 LambdaTools.String でロードすることで String ヘルパーが利用可能となる。現在利用できる機能はテキスト自動整形用の mb_folding() メソッドのみ。

ヘルパーメソッド仕様

mb_folding($str, $width, $encoding=NULL)
引数
$str

整形対象となる文字列。改行文字で区切られた複数行を指定可。入力文字列内にもともと存在する改行文字は、このメソッドが付与する改行に優先する。1行の半角換算文字数が指定値に満たない場合は、そのまま出力される。

なお、半角文字だけから構成される単語の途中に自動改行位置が来た場合、当該単語は分割されず次行先頭に割り当てられる。

句読点は行頭禁則文字とし、行頭に単独で出現する場合は直前行の行末文字とともに次行先頭に繰り越す。(その結果、直前行の長さは繰り越した文字分だけ短くなる)

行内にある連続する空白文字 (半角空白文字) は1つの空白文字に集約される。また、行頭が空白文字になる場合、当該文字は除去され行頭が空白文字から始まらないようにする。

$width

整形後の1行の最大長を指定する整数。長さは半角文字数で表し、全角文字は半角2文字分と換算。

$encoding

指定された文字列のエンコーディングを表す文字列。省略時 (=NULL) はその時点での mb_internal_encoding() の結果が使用される。この値は内部的に使用する正規表現の解釈に影響する。

戻り値: 整形した行からなる配列。(整形した文字列ではない点に注意。)

使い方

まずコントローラで Helper として宣言する

ビューやメールテンプレートでの使用例。CakePHP 2.x ではビューブロック (view block) が利用できるので、これを使用して自動整形を適用する部分と適用しない部分を容易に使い分けることができる。

自動整形例

元となるデータ

長い行がきちんとフォールディングされるかどうかの確認を行いたいのですが、適度な長さの文面が得られなかったのでこの文面で代用してみました。
半角72文字分で折り曲げられるのを期待しています。


長い・行がきちんとフォールディングされるかどうかの確認を行いたいのですが、abcdefghijkl適度な長さの文面が得られなかったのでこの文面で代用してみました。


途中に長い半角トークン aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa が入っている例。行頭の空白文字は除去されます。

1行の指定値より長い半角トークン ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 が入っている場合の例。

(半角) 72文字幅で整形した結果

長い行がきちんとフォールディングされるかどうかの確認を行いたいのですが、
適度な長さの文面が得られなかったのでこの文面で代用してみました。
半角72文字分で折り曲げられるのを期待しています。


長い・行がきちんとフォールディングされるかどうかの確認を行いたいのです
が、abcdefghijkl適度な長さの文面が得られなかったのでこの文面で代用してみ
ました。


途中に長い半角トークン 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa が入っている
例。行頭の空白文字は除去されます。

1行の指定値より長い半角トークン 
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 
が入っている場合の例。

関連エントリー

CakePHP のレンダリング結果を保存したい

CakePHP 2.x の Cookie と js.cookie.js

時刻入力用 jQuery Plugin TimePicki の不具合調整

CakePHP プラグインで HTTPS 判定

作業用モデルビヘイビア

CakePHP のバリデーション時に状況に応じてバリデーションルールを変更する

CsvLoader ビヘイビアを使って CSV を一発でロードする Cake Shell

無名関数からの外部変数参照について

CakePHP の Security コンポーネント、ベーシック認証、CGI

形態素解析システム MeCab (めかぶ) を CakePHP から利用する

Google APIs Client Library を CakePHP から利用する

分数電卓を作ってみる・その2

分数電卓を作ってみる・その1

CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法・その2

 CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法

CakePHP でストアドファンクション

テキストフィールドを CSV として処理する CakePHP ビヘイビア・補足

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その2

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その1

Google Maps で郵便番号⇒住所変換・その2

Google Maps で郵便番号⇒住所変換

Google Chart へのアクセスをヘルパーで実装してみる【その2】

Google Chart へのアクセスをヘルパーで実装してみる【その1】

Google reCAPTCHA を使いやすくする

駅データ.jp のデータを CakePHP から使う

CakePHP の小ネタ

UploadPack を Exif Orientation 対応にする

作業用テーブル処理を再利用可能なツール化してみる・その1

クリックイベントが2回実行される?!

CakePHP のフォームで required・その2

CakePHP の Paginator の sort() で昇順ソート時に NULL 値を最後にしたい

CakePHP のフォームで required

UploadPack のヘルパーメソッド名称が変わっていた

CakePHP 2.x の PaginatorHelper::sort の不思議

CakePHP で四苦八苦 - あるフィールドにだけ値が書き込まれない

UploadPack で四苦Hack その後

CakePHP の小ネタ

CakePHP v2 のエラー処理

IE10 と CKEditor

2013/03/23
IE10 と CKEditor

UploadPack で四苦Hack・その2

Paginator で見かけの URL を使用する方法

「Notes プラグインが見つかりません」

PHP 5.3 の「無名関数」

CakePHP v2 で HTTP エラー画面をカスタマイズする

UploadPack で四苦Hack

PHP 5.4 と CakePHP 2.x