phpの最近のブログ記事

PHPでも正規表現は使えます。と、当たり前と思うかもしれませんが、正規表現というものが、言語の進化によって使われなくなるのかなとおもったものの、やっぱ、便利です。

プログラマにとっては、覚えておくと非常に役に立つと思います。

perl使いの方には、わりと当たり前な感じですけどね。

PHPにおいては、Perl互換の正規表現なのか、一般的な正規表現(?)なのか、どちらを使うかで関数名(function)が違います。単純に、eregがpregになったりするだけですが、注意が必要です。

また、正規表現が正しく動作しているかどうか、いちいちテストが面倒です。

そこでみつけたのが、こちら!【PHP正規表現チェッカー!】

http://www.rider-n.sakura.ne.jp/regexp/regexp.php

WEB SEEKERさんのコンテンツというところにあります)

Perl互換の正規表現もチェックできますので、正規表現が苦手な方(私)には、ばっちりなサイトです。

CSVファイルのダウンロードを作成し、通常のHTTPでのダウンロードは成功しますが、IEで、HTTPS(SSL)での接続の場合、IEだと次のような「ダウンロードできません」というメッセージが表示されます。

---------------------------
Windows Internet Explorer
---------------------------
Internet Explorer では、xxxxxxxxxxxxxx をダウンロードできません。
 
 
 
このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。

この現象は、まったく理解できませんでしたが、SSL環境下で、IEという条件でのみ発生します。SSL+Firefoxだと発生しません。

以下のブログが参考になりました。

http://blog.gnetworks.co.jp/nk2/?p=54(開発日誌)

マイクロソフトのサポートページで解説されています。、
http://support.microsoft.com/kb/436605/ja

サポートページによると、IE5,IE6で確認とされていますが、IE7でも同様に発生します。

no-cache指定されていると発生するようです。

なんとなく意味がわかりました。IEだとページ閲覧もダウンロードもすべてtemporary Internet filesフォルダへいったん保存されます。保存されたデータは、no-cache指定されていると、即削除されるため、ダウンロードの場合の、

ダウンロード→temporary→指定フォルダ

この流れが実現できないためかと思われます。ダウンロード→temporaryこの時点で削除されてしまうため。

PHPで、これを回避するには、cacheするように設定することで対応可能です。

 

header("Cache-Control: public");
header("Pragma: public");

Outlook(Outlook Expressも?)で添付ファイルをつけてメール送信すると、なんとも不思議なことに勝手にリッチテキスト形式になるようで。

E-Mailの形式としては、リッチテキストは、SMTPのプロトコルとしては扱えませんので、添付ファイル扱いとなります。リッチテキスト部分だけ添付ファイルとなればいいのですが、なんと添付ファイル込みでのリッチテキストとなります。設定によっては、テキスト形式としているのにも関わらず、リッチテキスト化されてしまう現象も確認しております。

また、社内のネットワークで、メール環境をMS Exchangeで構築されている場合、MS Exchangeの設定でメールデータをリッチテキストに変換することそ推奨しているようです。添付ファイルがあった場合。

そうすると、どんなことをしても、添付ファイルは勝手にリッチテキスト内にあることになり、さらにbase64で暗号化されてしまいます。

このとき、リッチテキスト形式をメール内で扱うための形式をTNEFTransport Neutral Encapsulation Format)といいます。

 この形式については、日本語の記事がなかなか見つからず、以下見つけたのが、squirrelmailのt-nefプラグイン。これは、phpで書かれていますので、解析できるかなと思ってダウンロードしてみました。

いくつか修正ポイントはありましたが、わりと修正は簡単でした。修正したのち、includeでライブラリを読み込んでなんとか、t-nef形式を解読できるようになりました。

このプラグインのライセンスについては、まだちゃんと理解していませんが、問題なければ、ここ?どこ?かで公開したいと思います。

使い方は、以下。

http://www.squirrelmail.org/plugin_view.php?id=62

$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;
$params['input']          = $mail_source;	// メールをセット
$params['crlf']           = '\r\n';
// PEAR Mail_mimeDecode
$structure = Mail_mimeDecode::decode($params);
// 添付ファイルがms-tnefか判定
$tnef_body = '';
$csv_file = '';
if($structure->ctype_primary === 'multipart' ){
// マルチパート(添付があるとマルチパート)
for($p=0;$p<count($structure->parts);$p++){
if($structure->parts[$p]->ctype_secondary == 'ms-tnef'){
// found it!
$tnef_body = $structure->parts[$p]->body;
break; 				}
} 		}
if($structure->parts[$p]->ctype_parameters['name'] == '目的のファイル名'){
// 通常の添付
$csv_file = $structure->parts[$p]->body;
break;
}
if($tnef_body != ''){
include_once('attachment_tnef/tnef_attachment.php');
include_once('attachment_tnef/debug_functions.php');
include_once('attachment_tnef/functions.php');
include_once('attachment_tnef/tnef_file_base.php');
include_once('attachment_tnef/tnef_consts.php');
include_once('attachment_tnef/tnef_file.php');
include_once('attachment_tnef/tnef_mailinfo.php');
include_once('attachment_tnef/tnef_file_rtf.php');
include_once('attachment_tnef/tnef_vcard.php');
include_once('attachment_tnef/tnef_date.php');
$tnef_debug = true;
$attachment = new TnefAttachment($tnef_debug);
error_reporting(E_ALL);
$attachment->decodeTnef($tnef_body)
; 			$tnef_files = &$attachment->getFilesNested();
for($t=0;$t<count($tnef_files);$t++){
// hogehoge.txtファイルを探す
if($tnef_files[$t]->name == 'hogehoge.txt'){
$csv_file = $tnef_files[$t]->content;
break;
}
}
}
}
}

PHPのテンプレートエンジンといえば、Smartyです。

Smartyを使うときの作法として、自分では次のように継承クラスを必ず用意するようにしています。

xxxxSmarty.class.php(xxxは作成するSystem名)


<?php
require_once("Smarty.class.php"); // smarty.class.phpの指定。環境によって異なります。
class xxxxSmarty extends Smarty{ // Smartyクラスを継承したxxxxSmaryクラスを定義します。
public function __construct(){    // __construct()はPH5以上です。
$this->Smarty();
$this->left_delimiter = "{!";    // xoopsと同じにする。(xoopsに慣れてるので)
$this->right_delimiter = "}";
$this->template_dir = "xxxxxxxx/templates";
$this->compile_dir = "xxxxxxxx/templates_c";
}
}
?>


 テンプレート定義などソース毎に定義するのは面倒ですから、これで使うときは、
require_once("xxxxSmarty.class.php");
と自作クラスだけ呼ぶようにします。

$hoge = new xxxxSmarty();

__constructにより、newされたときに自動で実行されますので、再定義の必要がありません。

Smartyでの3桁区切りでカンマ[,]を表示する方法。

$var = 1234567890;

という値がセットされているとき。

{$var|number_format} 

こうすると

1,234,567,890

こうなります。

 

このアーカイブについて

このページには、過去に書かれたブログ記事のうちphpカテゴリに属しているものが含まれています。

前のカテゴリはJavaScriptです。

次のカテゴリはServerです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.04

にほんブログ村

にほんブログ村 IT技術ブログへ
にほんブログ村