[php]トークン分解でphp_strip_whitespace()関数を実装する
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:
-
<?php
-
// $Id: php_strip_whitespace.php,v 1.13 2007/04/17 10:09:56 arpad Exp $
-
-
-
/**
-
* Replace T_DOC_COMMENT in PHP 4
-
*/
-
} else {
-
}
-
-
-
/**
-
* Replace php_strip_whitespace()
-
*
-
* @category PHP
-
* @package PHP_Compat
-
* @license LGPL - http://www.gnu.org/licenses/lgpl.html
-
* @copyright 2004-2007 Aidan Lister <aidan@php.net>, Arpad Ray <arpad @php.net>
-
* @link http://php.net/function.php_strip_whitespace
-
* @author Aidan Lister <aidan @php.net>
-
* @version $Revision: 1.13 $
-
* @since PHP 5
-
* @require PHP 4.0.0 (user_error) + Tokenizer extension
-
*/
-
function php_compat_php_strip_whitespace($file)
-
{
-
// Sanity check
-
return;
-
}
-
-
// Load file / tokens
-
-
// Init
-
$source = '';
-
$was_ws = false;
-
-
// Process
-
foreach ($tokens as $token) {
-
// Single character tokens
-
$source .= $token;
-
} else {
-
-
switch ($id) {
-
// Skip all comments
-
case T_COMMENT:
-
case T_ML_COMMENT:
-
case T_DOC_COMMENT:
-
break;
-
-
// Remove whitespace
-
case T_WHITESPACE:
-
// We don't want more than one whitespace in a row replaced
-
if ($was_ws !== true) {
-
$source .= ' ';
-
}
-
$was_ws = true;
-
break;
-
-
default:
-
$was_ws = false;
-
$source .= $text;
-
break;
-
}
-
}
-
}
-
return $source;
-
}
-
-
// Define
-
{
-
return php_compat_php_strip_whitespace($file);
-
}
-
}
どうやらtoken_get_all()関数を用いて与えられたソースコードをトークン分解した後、コメントトークン以外を文字列連結した結果を返すというもののようです。
phpってトークン分解が関数でできるんですね。トークン分解と聞いてふと思い出したのがPHPソースからフローチャートを生成する | Shin x blogというブログの記事。がんばればphpだけでフローチャートを出力するプログラムが作れるのでは!?と妄想してしまいました。フローチャートに限らず、ソースコードを図示するという処理には少し興味があるので、token_get_all()関数は自分の中ではかなりツボな発見でした。php_strip_whitespace()関数が役に立った瞬間でした。