|
正規表現
|
管理人さんのブログ 2012-04-26 11:15:55
|
プログラマーだと正規表現使わずともちょこっとプログラム書けば色々出来てしまうので、今までほとんど正規表現使う事がなかった。
今回、1行で書けそうな処理だったので、あえて挑戦です。
メールアドレス判定
結果から書きます、コレ↓ですね。
preg_match("{^([a-zA-Z0-9.!#$%&'*/=?^_`|~{}+-])*@([a-zA-Z0-9])+([a-zA-Z0-9.-]+)+$}",$mailaddress);
本当は『.』が続いちゃダメだとか、『"』で囲まれた部分の特例とかあるんですが、大目に見てください。
ポイントは、デリミタを『/(スラッシュ)』ではなく『{}(角括弧)』にしたとこです(判定で『/(スラッシュ)』を使う為)。
※メールアドレスって、色んな記号が使えるんですね(ドメイン部分は『-』『.』と英数字だけですが…)。
文字列分割
入力された文字列を『空白』と『ダブルクォーテーション』で分割します。
検索エンジンで『blog "atom site"』みたいに入力するそのキーワード取得です(この例だと「blog」「atom site」がキーワード)。
以下、試行錯誤のアレコレです(書き込みの関係上、半角を全角にしてあります)。
動かないのもあります。
$cut_strs = mb_split(’[¥s]’, $in_str);
mb_ereg(”[¥s]”, $in_str, $cut_strs);
preg_match_all(’|”([^”]*)”(?=[¥s,]+)[¥s,]+|U’, $in_str, $cut_strs);
preg_match_all(”|<[^>]+>(.*)</[^>]+>|U”, $in_str, $cut_strs);
preg_match_all(’|<b>(.*)<¥/b>|U’, $in_str, $cut_strs);
preg_match_all(’|a(.*)b|U’, $in_str, $cut_strs);
preg_match_all(’|”(.*)”|U’, $in_str, $cut_strs);
preg_match_all(’/(”[^”]*(?:””[^”]*)*”/u’, $in_str, $cut_strs);
preg_match_all(’/¥¥G(”(?:[^”]|””)*”|[^¥s]*)¥s/u’, $in_str, $cut_strs);
preg_match_all(’/¥¥G(”(?:[^”]|””)*”|[^ ]*)[ ]/u’, $in_str.” ”, $cut_strs);
単純にmb_split()では出来なさそう。
mb_ereg()でなくpreg_match_all()を使うのは処理が早い(らしい)から(//uオプションを使えば、UNICODE対応しているらしい)。
…で、近い正規表現はこれ!
preg_match_all(’/(”(?:[^”]|””)*”|[^ ]*)[ ]/u’, $in_str.” ”, $cut_strs);
preg_match_allは、分割した語句は配列の[1]に入るみたいです。
if($cut_strs[1]) {
foreach($cut_strs[1] as $cut_str) {
//ダブルクォーテーションが入るので削除します
$cut_str = preg_replace(’/[”]/u’, ’’, $cut_str);
こんな感じにしました。
それにしても、分かりづらいですねぇ『正規表現』って。
何書いてあるのか、一見して分からない。
|
|
画像リサイズ
|
管理人さんのブログ 2010-11-15 12:15:04
|
この自作ブログのプログラムで、サムネイル画像生成するのはphpのimagecopyresized()関数を使っていた。
サイズが違えば、勝手に拡大縮小してくれます。
…で、出来上がる画像はこんな感じ。
画像はこれまた自作サイトの『連想検索3D』( http://jp.link.e-onlineservice.com )というとこのキャプチャです。
「ギザギザが目立つなぁ」とは思っていたが、こんなものかと諦めていた(色々なサイト見ても滑らかになっているので「どうやってるのかな?」と気にはなっていたが…)。
ふと、imagecopyresized()関数を調べなおしてみると、同じ機能のimagecopyresampled()関数という物があるらしい。
引数も同じなので、関数名書き換えるだけ。やってみました。
ワォ!綺麗ッ!
ちゃんと補間されてます。
imagecopyresampled()関数、知らなかったなぁ~。
|
|
REST SOAP
|
管理人さんのブログ 2010-11-15 12:14:02
|
上記実験サイト( http://imgsearch.e-onlineservice.com )で、Amazon Web Services と Yahoo!検索Webサービス、Google Ajax検索API を使っているのだが、こういうWebサービスのデータのやり取りはREST方式だったりします(Google Ajax検索APIは違いますが…)。
RESTというのは、GETパラメータでURLに値を与えてやればXMLが返ってくる方式。
例えば、Amazon Web Servicesで言えば、
http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&SubscriptionId=********************&AssociateTag=imgsearch-22&Operation=ItemSearch&ResponseGroup=Small,Images&Keywords=test&SearchIndex=Blended&Page=1&ContentType=text/xml
↑こんなURLでアクセスすると
結果がXMLでブラウザに表示されます(SubscriptionIdは自分で取得してください)。
最初の取っ掛かりがURLを打ち込むだけでとても簡単なので、最近のWebサービスはこのRESTがメインだったりします(Yahoo!のWebサービスもほぼREST)。
phpのプログラムはこんな感じ。
$xml = simplexml_load_file($url);
$items = ($xml->Items);
foreach($items->Item as $amazon_item) {
....
....
}
$amazon_itemに検索結果が入ってくるので、後はそれを利用するだけ。
使ってみた結論、SOAPより早い処理で結果が来るので、困らなければ(与える要素が多くなければ)REST方式で十分です。
このRESTより細かく設定できるのがSOAP。
お仕事でSOAPのサービスを使う事になったので、まずはAmazon Web Servicesで試してみました(Amazon Web ServicesはRESTとSOAP両方に対応)。
ネットで情報を探します。…が、phpでSOAPサービスにアクセスする方法ってほとんど載ってないですね。
Amazonのサイトも何処を見ればいいのか分からなかったです(しかも、英語だし…)。
多分↓この辺りです。
Amazon Web Servicesのサイトの左下。
『Developer Connection』-『Resource Center』
『Amazon Associates Web Service』
『Technical Documentation』
『Docs: Amazon E-Commerce Service (API Version: 2007-02-22)』
『Online HTML』-『View』
『API Reference』内に色々あります(WSDLの情報とかモロモロ)。
なんとかやってみました。
php5以上だと標準でSOAPが使える様です。
…が、パッケージのインストールは必要です。
# yum install php-soap
# /etc/init.d/httpd reload
phpのプログラムは以下です。
$client = new SoapClient("http://ecs.amazonaws.com/AWSECommerceService/JP/AWSECommerceService.wsdl");
$params = array(
'SubscriptionId' => '********************',
'AssociateTag' => 'imgsearch-22',
'Request' => array(
'SearchIndex' => 'Blended',
'Keywords' => 'test',
'ResponseGroup' => array('Small','Images')
)
);
$result = $client->ItemSearch($params);
$items = $result->Items;
foreach($items->Item as $amazon_item) {
....
....
}
こんな感じですね(SOAPで提供されてるItemSearchをそのまま使うやり方です)。
もっとキッチリやろうとすると、最初にXMLを作っておいて送信という感じですね。
$msg = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-enc="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header>
<UserInfo xmlns="http://********">
<UserName>***************</UserName>
</UserInfo>
</soap:Header>
<soap:Body>
<ItemSearch xmlns="http://********">
....
....
</ItemSearch>
</soap:Body>
</soap:Envelope>';
$client = new SoapClient("http://********wsdl");
$result = $client->__doRequest($msg,"http://********","http://********",0);
結果もXMLパーサで解析したり…。
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "getBody");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!xml_parse($xml_parser, $result, false)) {
....
....
}
ま、この辺りはやり易い様に…。
本で勉強するならこの辺りですかね(Amazonです)。
~~~~
amazonから、以下のメールが送信されてきた。
『Amazon アソシエイト Web サービスの名称を、「Product Advertising API」へ変更』
『Product Advertising API へのリクエストに、認証のための電子署名を含める必要がある』
名称はいいんだけど、リクエストに認証を付けなければいけないらしい。
説明読んだけど、ちょっと手間がかかる、う~む。
仕方ない、やるか…。
………
………
………
やりました、RESTだけ…。
面倒&時間無しなので、SOAPのプログラムは、RESTに直して対応済み。
|
|
session
|
管理人さんのブログ 2010-03-04 16:00:13
|
session廃棄
セッションを消す時は、クッキーも消した方がいい。
====
session_start();
// セッション変数を全て解除する
$_SESSION = array();
// セッションを切断するにはセッションクッキーも削除する。
// Note: セッション情報だけでなくセッションを破壊する。
if(isset($_COOKIE[session_name()]))
{
setcookie(session_name(), '', time()-42000, '/');
}
// 最終的に、セッションを破壊する
session_destroy();
====
こんな感じ。
上記処理を通らなければ(セッション廃棄ページに行かない場合)当然セッションファイルが残る(本来はその為のセッションなので)のだが、定期的にセッションファイルを消したい場合は以下の設定をする。
php_value session.gc_probability 1
php_value session.gc_divisor 100
php_value session.gc_maxlifetime 86400
session_start()した時に、gc_divisor分のgc_probabilityの確率でガベージコレクションが起動して、gc_maxlifetime以上経過しているセッションファイルを消してくれます。
上記例では、1/100の確率で1日経過しているセッションファイルを消します(session_start()時)。
sessionキー
キーというか、変数名というか、これは数値から始まる物は指定できないのですね。
今までのLinux上の環境では日時(数値)をsessionキーにしてアクセスしていたのですが、環境を変えた途端動かなくなったのでビックリしました。
原因探るのに数時間、やっとさっき、数値で始めるのはダメだと気付いたとこです。
でも、今まで何で問題無く動いていたんだろ(64bitOSにしたら出たってとこからすると、型の解釈の違いがあるんだろうなぁ)?
|
|
ダウンロードできない
|
管理人さんのブログ 2009-03-25 13:47:29
|
phpで動的に生成したhtml以外のファイルをダウンロードさせる。
普通のaタグ指定で何の問題もなくいけるのだが、指定のURLを直接ブラウザの『URL入力欄』にいれると、以下のエラーダイアログ。
====
ダウンロードできません。このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。
====
処理的にaタグ使わずにやりたいので原因究明。
どうやら、ダウンロードする時に一時キャッシュするのがブラウザのセキュリティ的に引っかかるらしい。
header("Cache-Control: public");
↑これが必要との事。
…という事で、
<?php
$buf = "abc,def,ghi";
$len = strlen($buf);
header("Cache-Control: public");
header("Content-type: application/octet-stream");
header("Content-Length: $len");
header("Content-Disposition: attachment; filename=test.csv");
print $buf;
こんな感じで解決。
~~~~
…と思っていたら、javascriptのwindow.open()でcsvを開こうとすると、ウィンドウが開かない(開きつつあるウィンドウが閉じてしまう)。
※aタグやrefreshやURL直接入力ならOK!window.open()時だけ…。しかもIE7だけでした。
これは、クライアント側で設定してもらうしかないみたい。
[インターネットオプション]-[セキュリティタブ]-[レベルのカスタマイズ]にある、『ファイルのダウンロード時に自動的にダイアログを表示』を『有効にする』
↑これで、いけた。
~~~~
更に…。
静的に置いてあるCSVファイルをダウンロードさせる為、URL直接入力したりすると『このコンテンツは、正しく表示されない場合があります。コンテンツがコンテンツのセキュリティ情報と一致しないため、ファイルは制限されました。』←こんな警告(次から次へと全くもぉ…)。
調べ中。
…
調べてもわかんない。
これは、もぉ置いてあるCSVをPHPで読み込んでheader付けてそのまま出力だな。
この方法で回避できるのを確認。
~~~~
更に更に…。
『ファイルのダウンロード』で保存を選ぶと『ファイルの情報を取得しています』のまま終わらない。
他のタブに切り替えた後の1回だけがダメ(キャンセルしてもう一度やり直せばOK)。
↓同じ現象の報告ありました。
http://ameblo.jp/itboy/entry-10034271288.html
これ、WindowsXPのIE7のバグ。
http://support.microsoft.com/kb/932823/ja
ここの更新プログラムを適応したら直りました。
~~~~
それから…。
SSLな環境で「IE7」だと(Firefoxだと大丈夫)動的生成したPDFが表示されない。
header("Pragma: public");
ヘッダに↑コレ入れたら表示されました。
|
|
zip
|
管理人さんのブログ 2009-02-04 16:03:06
|
PHPでzipの解凍をしたい。
マニュアルを読むとZIP関数なるものがあるが、別途インストールが必要(PHP 5.2.0以降なら標準なのかな?)。
PHPをコンパイルすればいけそうですが、さすがに面倒。
PECL経由でインストールしました。
そのメモです。
まずは、必要なパッケージをyumにてインストールしておきます。
# yum install php-devel
# yum install zlib-devel
# yum install php-pecl-memcache
PECLというのは、C言語で書かれたPHPで利用できる拡張ライブラリらしいですね。
上記の yum install で使える様になってます。
ここで、
# pecl install zip
とすると、一気に処理してくれて『zip.so』というモジュールファイルを作成してくれます。
後は、コレを『php.ini』で指定(『extension=zip.so』と追記)し、apache を再起動。
phpinfo();とか書いてブラウザで見れば、zip が enabled になってるはずです。
…が、自分の場合、ココではまりました。
何度apacheを再起動しても、有効になってくれません。
apache の error_logで、zip.so が読めないエラーが出てました。
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/zip.so' - /usr/lib/php/modules/zip.so: cannot open shared object file: Permission denied in Unknown on line 0
SELinuxですかね。
# ls -Z で見ると、
-rwxr-xr-x root root user_u:object_r:tmp_t zip.so
他のに合わせれば大丈夫そう…。
# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t zip.so
-rwxr-xr-x root root system_u:object_r:textrel_shlib_t zip.so
apache 再起動。
無事、zipが有効になり、PHPにてZIP関数が使える様になりました。
|
|
価格にカンマ
|
管理人さんのブログ 2007-12-28 15:30:24
|
価格部分の数値には『,(カンマ)』を入れなければいけない。
3桁毎に数値を拾って、カンマと共に左側へ文字列連結か…、と思い関数の原型作ってそのファイルをinclude。
中身作り始めた時、ふとググると…。
http://jp.php.net/manual/ja/function.number-format.php
あれまぁ、PHPには『number_format』なんていう、そのまんまの関数があるんだねぇ。
なんの苦労もせず、カンマ付きました。
|
|
php.ini
|
管理人さんのブログ 2007-03-24 08:48:00
|
sessionの実験。
■cookie_lifetime
cookie_lifetimeを60秒設定にすると、どこから60秒なのか。
sessionでつないで、50秒ほど放っておいてブラウザを閉じる。
30秒(最初の頃からは1分20秒)経ってからsessionつなぐと切れている。
sessionでつないで、50秒ほどsessionのあるページをウロウロしつつブラウザを閉じる。
30秒(最初の頃からは1分20秒)経ってからsessionつなぐとつながっている。
…という事は、
session_start();
を通ってる時点で更新されてるっぽい。
■gc_probability
ガベージコレクションが発動する確立。
(この数値/100) の割合。
分母はこれ→ gc_divisor(通常100)。
■gc_maxlifetime
何秒でガベージコレクションが発動するのか。
■cache_limiter
private設定で、戻るを押した時にもキャッシュを覚えておいてくれる(読み直しがいらなくなる)。
妙な所でキャッシュされてしまうから、使えないか…。
|
|
アップロードデータのサイズ
|
管理人さんのブログ 2007-02-13 13:24:15
|
phpだと、
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
して
php.iniの
upload_max_filesize = 1M
memory_limit = 1M
post_max_size = 1M
で、アップロードさせるサイズ制限を変更できる。
|
|
|