WEBフロントをやっていると、テンプレート化するためにPHPで作り
納品段階ではHTMLに変換することってよくあると思うんですが、
先日業務でPHPファイルをHTMLに変換する必要があり、色々調べていたら
Web学びさんが書かれていたPHPテンプレを静的HTMLに変換するコマンド]の記事を発見いたしました。
Web学びさんがつくられた ptoh は引数で渡したPHPファイルをHTMLに変換するのですが、今回は該当ディレクトリ内にあるPHPファイル全てHTMLに変換したかったので
ptohを基にワンライナーで出来るものを作りました。
完成型
完成系は以下のようになります。以下ファイルの $target_dir を変換したいディレクトリに指定し、コマンドプロンプトなりターミナルなりで
ファイルを実行すればPHPファイルは全てHTMLに変換されます。変換されたPHPファイルは削除されるのでご注意ください。
削除したくなければ unlink($file); をコメントアウトしてください。
#!/usr/bin/php
<?php
$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);
$list = array();
foreach ($iterator as $fileinfo) {
if (!$fileinfo->isFile()) {
continue;
}
$file = $fileinfo->getPathname();
$info = new SplFileInfo($file);
if($info->getExtension() == 'php'){
convertHtml($file);
unlink($file);
}
}
function convertHtml($target){
$contents = '';
ob_start();
include($target);
$contents = ob_get_contents();
ob_end_clean();
file_put_contents(
preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
preg_replace('/\A\n/', '', $contents)
);
}
それではブロックずつ解説していきたいと思います。
対象ディレクトリの再起処理
$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);
対象ディレクトリを RecursiveDirectoryIterator と RecursiveIteratorIterator で
再起処理にてファイルを全て取得します。
恥ずかしながら今回このクラスを初めてしりました。
今までディレクトリの中のファイル一覧を取得するときって再起処理にて自身の関数を呼び出すやり方しかしらなかったもので。
これめっちゃ便利です
ファイルであれば処理をする
foreach ($iterator as $fileinfo) {
if (!$fileinfo->isFile()) {
continue;
}
・
・
・
}
上記で取得したファイル一覧一つずつをみていきファイルであれば処理をするようにしています。
拡張子をみてPHPファイルのみ処理を行う
$file = $fileinfo->getPathname();
$info = new SplFileInfo($file);
if($info->getExtension() == 'php'){
convertHtml($file);
unlink($file);
}
RecursiveDirectoryIteratorは FilesystemIteratorを
FilesystemIteratorは DirectoryIterator::getPathnameを継承しているので
getPathnameでファイルのパスとファイル名を取得
取得したファイル名から拡張子を取得するため
PHP組み込みクラスSplFileInfoのgetExtensionで
拡張子を判別し、PHPならptohをラッパーした関数にファイルを渡すようにしております。
またHTMLに変換したPHPファイルは不要なのでunlinkにて削除するようにしております。
SqlFileinfoも今回初めてしりました。
以前は正規表現にて拡張子を取得していたのですが、このSplFileinfoもすごい便利ですね。
ptohを関数化
処理が煩雑になるためptohは関数化しております
引数はにて渡されたファイルをHTMLに変換するようにしております。
function convertHtml($target){
$contents = '';
ob_start();
include($target);
$contents = ob_get_contents();
ob_end_clean();
file_put_contents(
preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
preg_replace('/\A\n/', '', $contents)
);
}
以上、となっております。
今回PHP組込みクラスで知らなかったものが色々あったので
勉強になりました。