str_replace(array(" ","\n"),"",$source);
としてみたのですが、これだとソース内の「function」や「class」が無効になってしまいます。
他に良い書き方があったら教えてください。
こんな感じでどうでしょう?
<?php /* * PHPソースコード内の余分な空白を可能なかぎり削除します。 * * ・単純に空白文字を消してしまうと色々問題が起こるので段階的に置換してみます。 * ・文字列リテラル中の空白やコメントっぽい文字列のケアは対応外。 * 例) "「こ の」空白は必要。//ここはコメントじゃないよ!" */ function cleanWhiteSpace($source) { //複数行コメンを削除 $source = preg_replace('|/\*.*?\*/|sm', '', $source); //1行コメントを削除 $source = preg_replace('/\/\/.*/', '', $source); #シャープによる1行コメントも削除 $source = preg_replace("/\x23.*/", '', $source); //空白文字の連続を半角スペース一つにする $source = preg_replace('/\s+/', "\x20", $source); //記号前後の空白を削除 $source = preg_replace('/\s?([\(\)\[\]\{\},\;:=<>\+\-\/\*\%\!\?&\|])\s?/', '$1', $source); //最後のphpの閉じタグは無くて良いのでついでに削除 $source = preg_replace('/\?>$/s', '', $source); return $source; } //テスト echo cleanWhiteSpace(file_get_contents(__FILE__)); ?>
↓実行結果
$ php a.php <?php function cleanWhiteSpace($source){$source=preg_replace('|/\*.*?\*/|sm','',$source);$source=preg_replace('/\/\/.*/','',$source);$source=preg_replace("/\x23.*/",'',$source);$source=preg_replace('/\s+/',"\x20",$source);$source=preg_replace('/\s?([\(\)\[\]\{\},\;:=<>\+\-\/\*\%\!\?&\|])\s?/','$1',$source);$source=preg_replace('/\?>$/s','',$source);return $source;}echo cleanWhiteSpace(file_get_contents(__FILE__));
文字列リテラル中の空白やPHPコメントに見える文字列まで削除してしまうのが致命的な欠点ですが、そこに目を瞑れればそこそこ綺麗に動く気がします。
コメント(4件)
(1)軽量化とはファイルサイズを小さくするという意味ですか?
preg_replaceで「空白が連続している箇所は1つに」して「改行コードは全て削除」すればいいですね
(2)軽量化とは動作を軽くするという意味ですか?
テキストから中間コードに変換する際に関係するといえば関係しますが、
スクリプトが短ければ短いほど無視できるほどの時間となりますし、
スクリプトが長ければ長いほど中間コードを使って実際に処理を行う時間のほうが問題となりますので、
いずれにしても残念ながら改行やスペースを削っても実質変わらないのですよ
などと書いてから気づいたのだけど、、、回答拒否されてますね(苦笑)
せっかく書いたのでコメントのほうに載せておきます
ただ、今回は暇だったのでちょっとそれっぽい回答をしてみました。
あと、私は自分がやろうとしている事の「答え」を知りたいから質問したわけで、私の目的や考え方を指摘していただきたい為に質問したのではありません。
単にコードを出して「これが出来ない」と書くと誰も答えてくれないと思い、「スペースと改行を削除しようとした理由」を書く為に、冒頭に「軽量化の為に~」と入れただけです。まさかそこを突っ込まれるとは思いもしませんでした。
質問の仕方が悪かったと反省します。
すぐに『え?』とわかる程度なのでまだ大丈夫だったと思いますw