[php]トークン分解でphp_strip_whitespace()関数を実装する

カテゴリ: Linux,php / author: uechoco / 2007年12月29日 21:10:00
この記事を読む時間:726くらい

1つ前の[php]php_strip_whitespace()でソースコードの容量を削減の続き。前の記事では

ちなみにphp_strip_whitespace()関数は、PHP5.0.0から実装され、PHP5.0.1から正しく動くようになった関数です。それより前のバージョンでこの関数を使いたい場合はPEAR::PHP_Compatを利用するのが一番早い方法です。

と書きました。

PEAR::PHP_Compatではどうやってこの関数を再現しているかというと、PHP_Compat内のphp_strip_whitespace()関数のCVSレポジトリを見るとわかります。が、下に貼り付けました。

PHP:
  1. <?php
  2. // $Id: php_strip_whitespace.php,v 1.13 2007/04/17 10:09:56 arpad Exp $
  3.  
  4.  
  5. /**
  6.  * Replace T_DOC_COMMENT in PHP 4
  7.  */
  8. if (!defined('T_ML_COMMENT')) {
  9.    define('T_ML_COMMENT', T_COMMENT);
  10. } else {
  11.    define('T_DOC_COMMENT', T_ML_COMMENT);
  12. }
  13.  
  14.  
  15. /**
  16.  * Replace php_strip_whitespace()
  17.  *
  18.  * @category    PHP
  19.  * @package     PHP_Compat
  20.  * @license     LGPL - http://www.gnu.org/licenses/lgpl.html
  21.  * @copyright   2004-2007 Aidan Lister <aidan@php.net>, Arpad Ray <arpad @php.net>
  22.  * @link        http://php.net/function.php_strip_whitespace
  23.  * @author      Aidan Lister <aidan @php.net>
  24.  * @version     $Revision: 1.13 $
  25.  * @since       PHP 5
  26.  * @require     PHP 4.0.0 (user_error) + Tokenizer extension
  27.  */
  28. function php_compat_php_strip_whitespace($file)
  29. {
  30.     // Sanity check
  31.     if (!is_scalar($file)) {
  32.         user_error('php_strip_whitespace() expects parameter 1 to be string, ' .
  33.             gettype($file) . ' given', E_USER_WARNING);
  34.         return;
  35.     }
  36.  
  37.     // Load file / tokens
  38.     $source = implode('', file($file));
  39.     $tokens = token_get_all($source);
  40.  
  41.     // Init
  42.     $source = '';
  43.     $was_ws = false;
  44.  
  45.     // Process
  46.     foreach ($tokens as $token) {
  47.         if (is_string($token)) {
  48.             // Single character tokens
  49.             $source .= $token;
  50.         } else {
  51.             list($id, $text) = $token;
  52.            
  53.             switch ($id) {
  54.                 // Skip all comments
  55.                 case T_COMMENT:
  56.                 case T_ML_COMMENT:
  57.                 case T_DOC_COMMENT:
  58.                     break;
  59.  
  60.                 // Remove whitespace
  61.                 case T_WHITESPACE:
  62.                     // We don't want more than one whitespace in a row replaced
  63.                     if ($was_ws !== true) {
  64.                         $source .= ' ';
  65.                     }
  66.                     $was_ws = true;
  67.                     break;
  68.  
  69.                 default:
  70.                     $was_ws = false;
  71.                     $source .= $text;
  72.                     break;
  73.             }
  74.         }
  75.     }
  76.     return $source;
  77. }
  78.  
  79. // Define
  80. if (!function_exists('php_strip_whitespace')) {
  81.     function php_strip_whitespace($file)
  82.     {
  83.         return php_compat_php_strip_whitespace($file);
  84.     }
  85. }

どうやらtoken_get_all()関数を用いて与えられたソースコードをトークン分解した後、コメントトークン以外を文字列連結した結果を返すというもののようです。

phpってトークン分解が関数でできるんですね。トークン分解と聞いてふと思い出したのがPHPソースからフローチャートを生成する | Shin x blogというブログの記事。がんばればphpだけでフローチャートを出力するプログラムが作れるのでは!?と妄想してしまいました。フローチャートに限らず、ソースコードを図示するという処理には少し興味があるので、token_get_all()関数は自分の中ではかなりツボな発見でした。php_strip_whitespace()関数が役に立った瞬間でした。


コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.