Text_Highlighter 設置プロセス(2)
2008年10月2日 20:53
こんばんは。
最近、DSでアクションゲームをやりすぎて、左手親指の爪の辺りが痛い掛尾です。
さて、今回はText_Highlighter 設置プロセス第2弾という事で、MySQLから取得したデータにText_Highlighterを適用してみようと思います。
ファイルの設置方法はText_Highlighter 設置プロセス(1)を参照して下さい。
では、始めましょう。
まずは、MySQLからデータを取得するという所ですが、接続等から説明を始めると長くなるので割愛します。
テーブルのカラム構成は、id int(11)、title varchar(64)、body textとでもしておきましょうか。
今回は上記のbodyカラムの中に、以下の様にカスタムタグで囲まれたテキストが存在するものとして話を進めます。
〜 略 〜 |code:PHP| $a = 'テキスト1'; $b = 'テキスト2'; $c = $a . $b; echo $c; |/code| 〜 略 〜
このカスタムタグ|code:PHP|〜|/code|の部分だけをPHPの構文でハイライトしたいので、bodyカラムのデータ内のカスタムタグの部分だけを正規表現で抽出して、以下の様にText_Highlighterを通すようにします。
// $db_dataにはMySQLのデータがハッシュで格納されている $data = $db_data['body']; // Text_Highlighterをインクルード require_once( 'Text/Highlighter.php' ); require_once( 'Text/Highlighter/Renderer/Html.php' ); // HTML Rendererのインスタンス生成 $renderer = new Text_Highlighter_Renderer_Html( array( 'numbers' => false, 'tabsize' => 4 ) ); // テキスト内のカスタムタグブロックを一つずつ変換 while( preg_match( '/\|code\:([^\|]*?)\|(.*?(?:(?=\|code\:(?:[^\|]*?)\|)|(?=\|\/code\|)))/s', $data, $matches_value ) ){ $type = $matches_value[1]; $value_str = $matches_value[2]; $hlHtml =& Text_Highlighter::factory( strtoupper( $type ) ); $hlHtml->setRenderer( $renderer ); $chgCode = $hlHtml->highlight( $value_str ); $chgCode = preg_replace( '/(\s*(\r\n|\r|\n))/', '', $chgCode, 1 ); // 何となく開始タグの後に改行入れたくなるので $data = preg_replace( '/\|code\:'.preg_quote( $type, '/' ).'\|'.preg_quote( $value_str, '/' ).'\|\/code\|/', $chgCode, $data, 1 ); } echo $data;
これで、$dataには、カスタムタグ内が|code:○○|の○○の部分、つまりPHP構文でハイライトするためのタグ付きのテキストに変換されるはずです。
後は、CSSファイルで色やマージン等を指定すれば、好みの表示方法が実現できます。
実用的な事を考えると、Text_Highlighterがどうこうというより、正規表現の方が肝心だったりという気も若干しますが…。(実際、僕も苦労しました・苦笑)
実際、丸々ハイライトする事ってほとんどないと思いますしね(笑)
こんな感じで、Text_Highlighter 設置プロセスは完結とします。
※このスクリプトにおいて、動作の検証は行っていませんので、責任は一切負いません。
徳島県徳島市名東町
tel/fax 088-635-5859
営業時間 平日 10:00〜18:00
※打ち合わせ等で不在の場合は、お電話でのお問い合わせに対応できない場合がありますので、ご了承ください。
徳島・香川・愛媛・高知および大阪・京都を中心にご依頼を承ります。その他の地域でも、メール・お電話・FAX・Skype等での作業が可能であれば柔軟に対応いたします。