SYSTEM238 / NOTES1 / PHP / PHPの小ネタ1

NOTES1 PROG1
PHPの小ネタ1
独立したノートにするほどでもない小ネタを集めてみました。
「CSV出力時のデータ中の改行」「Excel/word出力(簡易Ver)」「ファイル一覧を取得する(glob()を使おう!!)」「文字列を数値文字参照変換(エンティティ化)する」

1.CSV形式で出力時するときにデータ中の改行を処理する

CSV形式で出力するときにデータ中に改行があるとレイアウトが崩れてしまい、移行先でインポート時に問題が発生してしまいます。この場合「データ中の改行を削除してしまう」で対応してもいいですが、これだと文章がひと繋がりになってしまい残念な事になります。

移行先のシステムが垂直タブ(\x0b)に対応(Excel、Wordは対応してます)していれば、改行→垂直タブに変換する事によって改行表現を残す事ができます。

/**
 * 改行を垂直タブに変換
 * @param   string  $str    変換したい文字列
 * @return  string          変換後文字列
 */
static function eol2vtab($str){
    return strtr($str, array("\r\n"=>"\x0b", "\r"=>"\x0b", "\n"=>"\x0b"));
}

2.Excelやwordにファイル出力する(簡易Ver)

1.ExcelやWordはHTMLを読み込む事が出来る。
2.httpヘッダでExcel/Wordを指定するとPHPから直接これらのアプリにHTMLを読み込ませる事ができる。

(1)+(2)の組み合わせで簡易的にだけどPHPからExcel/Wordにデータを出力する事ができます。

ただし、関数が使えなかったり、修正して保存は別名保存する必要があったり、レイアウトの再現度がイマイチだったりなど注意が必要です。

最終成果物を作成するというよりも、他のExcel/Wordに切り貼りする元データを作成するのにブラウザからhtml保存〜Excel/Wordで読込みの手間を省くくらいを期待しておけばガッカリしません。

この辺をなんとかしたい場合はPHPExcel / PHPWordを使いましょう。

//ヘッダ出力
<?php
header('Content-Type: application/vnd.ms-excel');               //wordは vnd.ms-word
header('Content-Disposition: attachment;filename="xxx.xls"');   //wordは ~.doc
?>
<html>

... htmlファイル ...

</html>

3.ファイル一覧を取得する(glob()を使おう!!)

ファイル一覧を取得する方法にはopendir()〜readdir()を使う旧来の方法と、PHP4.3, PHP5以降でサポートされたglob()を使う方法があります。glob()の方が記述が簡単だし、ファイル名のパターンを指定できたりと便利になっています。

ネットを「php ファイル一覧」みたいなワードで検索すると、今だに旧来の方法がヒットします。なので、少しでもglob()を使ってもらうためにノートしておきます。

旧来のopendir()〜readdir()

if ($handle = opendir('/path/files')) {
    while (false !== ($file = readdir($handle))) {
        if ('txt' != pathinfo($file, PATHINFO_EXTENSION)) continue;
        echo "$file\n";
    }
    closedir($handle);
}

glob()を使った方法

foreach (glob("/path/files/*.txt") as $file) {
    echo "$file\n";
}

参考:PHP: glob - Manual

4.文字列を数値文字参照変換(エンティティ化)する

文字列を数値文字参照変換(エンティティ化)します。

メールアドレスや電話番号などを数値文字参照に変換すれば、webページ見ている人には影響なく自動収集ソフトに収集されにくくなります。

ただし、最近の自動収集ソフトは優秀なので数値文字参照変換だけでは気休め程度にしかなりません。本格的にやるならJavaScriptが必要です。

/**
 * 数値文字参照文字列を作成する
 * @param   string  $str    変換前文字列
 * @return  string          変換後文字列
 */
function cnvNumChar($str)
{
    $ret = '';
    for ($i = 0; $i < strlen($str); $i++) $ret .= '&#' . ord($str[$i]) . ';';
    return $ret;
}