忍者ブログ

カウンター

プロモーション

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


No Image

Google Calendar API で祝日取得関数を作る

PHP の調べ物

メモですφ(..)メモメモ

Google Calendar API の引数の説明はこちらでお世話になった
http://www.pahoo.org/e-soul/webtech/php06/php06-31-01.shtm

PHPで祝日を求める
といいうページも上記のサイトにあった

API はGoogle API key の必要な呼び方と
そうでない呼び方があるらしい
その説明とパースと配列の作成はこちらでお世話になった
http://kijtra.com/article/get-japanese-holiday-from-google/

それで作ったのは
// Google Calendar APIを使って1年分の祝日を取得
// 祝日を取得したい西暦:$startYear
// 祝日を取得開始する月:$startMonth
// 何か月分必要か:$monthSum
function getHoliday_by_Google($startYear=""$startMonth=""$monthSum=12) {

    
// --- 開始(年) ---
    
if(empty($startYear))
    {
        
$startYear date("Y");    //4桁の西暦
        
if(empty($startMonth))
        {
            
$startMonth '01';
        
$finishMonth '01';    //開始が変わるので終わりも変わる
        
}
    }

    
// --- 開始(月) ---
    
if(empty($startMonth))
    {
        
$startMonth date("m");    //nだと1桁、mだと2桁
        
$finishMonth date("m");    //開始が変わるので終わりも変わる
    
}

    
// ---終了(年と月) ---
    
if(empty($finishYearMonth))
    {

        
$finishYearMonth date('Y-m-d\TH:i:s'mktime(000$startMonth $monthSum0$startYear)); //時,分,秒,月,日,年
    
}

    
$startMonth=str_pad($startMonth2"0"STR_PAD_LEFT);    //引数で文字列でなく数値の場合の為、0埋め2桁の文字列にする


    // カレンダーID
    
$calendar_id urlencode('japanese__ja@holiday.calendar.google.com');
     
// 取得期間
    
$timeMin  "{$startYear}-{$startMonth}-01T00:00:00Z";
    
$timeMax "{$finishYearMonth}Z";
echo 
$timeMin." ".$timeMax."<br>\r\n";
    
$url "https://www.google.com/calendar/feeds/{$calendar_id}/public/basic?start-min={$timeMin}&start-max={$timeMax}&max-results=30&alt=json";

    
$cnt 0;
    
$result = @file_get_contents($url);
   //~~~配列の処理~~~

    }


説明補足:
~~~配列の処理~~~ の処理は、自分にあった処理がいいんじゃないかと
思た(嘘ですwほとんど参考と一緒になったので載せませんw)ので割愛してます^w^;

一応、PHPのDateTime::RFC3339
http://php.net/manual/ja/class.datetime.php
でRFC3339は"Y-m-d\TH:i:sP"
とありますが、そのままでは動かないのが判明(余談ですが、date("c")でも同じ)
どうも
"Y-m-d\TH:i:sP"
じゃなく、
"Y-m-d\TH:i:s"
としないと、ロケール関係の時間が入ってしまって動かない
ので単純にPHP のDateTime::RFC3339 は使えませんでした。

今のところはデベロッパーのキーが必要ないので動いていますが、
あんまり沢山使うとまずいのでPHPシリアライズのファイルでも作って
キャッシュをセーブしようかなとか考えてます。

こんな感じですが以上、メモでした<__>

拍手[0回]

PR

No Image

PHP のextension であるbcompilerをVisual Studioでbuild する(1/2)

PHP の調べ物

PHP を使っていると度々魅力的な拡張に出くわす@v@
今回、
bcompiler — PHP バイトコードコンパイラ
というものに出くわして
PHP をインストールせずにexe 形式の実行ファイルを使って
サーバーを擬似的に作れるかもしれない?!という事を発見した。

そして調べていると以下に
http://php.net/manual/ja/bcompiler.installation.php
この PECL 拡張モジュールの DLL は、現在存在しません。 Windows でのビルド も参照ください

とある、^Д^ありえない、一番面倒くさいパターンwww

ネタバレ的なWindows のコンパイルのドキュメントの主要はWiki でした。

Windows Specific Internals Docs

とりあえず、他の方法、つまり他のバージョンのPHP から
該当の拡張が引っ張れないかな?と思ってやってみた。

http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/
で、適当にダウンロードして調べたら
xampp-win32-1.7.1

%userprofile%\Downloads\xampp-win32-1.7.1\xampp\php\ext
に、
php_bcompiler.dll
があるジャマイカ!!!!
が、それ以後のには
php_bcompiler.dll
はやはり無い;x;

これや!と思って現在の、自身の環境、PHP5.3.5 に持ってきたが
PHP Warning:  PHP Startup: bcompiler: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
 in Unknown on line 0
Warning: PHP Startup: bcompiler: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
 in Unknown on line 0
PHP Warning:  PHP Startup: bcompiler: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
 in Unknown on line 0
Warning: PHP Startup: bcompiler: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
 in Unknown on line 0
と出て無理っぽい

なんでか調べると、PHP のバージョンによって、
コンパイラのバージョンとか、関数の違いとか異なるから
違うと動かないっぽい

一応公式で調べると
PHP 拡張モジュールの Windows へのインストール
ではphp.exe -i してとか、書いてあって、phpinfo()関数使えば
拡張が動いているか分かるよって書いてあるけど、どう考えても無理っぽい・・・

自分でコンパイルしていいよ!とか軽いノリなのかもしれないが
とてつもなく面倒臭いのは目に見えていた゚w゚;

PHP は簡単にWeb系のプログラムが出来るからいいんじゃないか!!!

なんでコンパイルせなぁーあかんのや!(注意:大阪の人じゃぁーありません)

と悩む事約3日、もう逃げられない、イライラとの対決もおさらばしたい!

やるか!もう手が動けばなんとかなる!と思って、今まで調べていたことから
探っていくか・・・と思った。

普通に
Windows システムへのインストール
という所の目次に
手動でのインストール
という項目があり其処に
 PHP for Windows: Binaries and Sources
からWindows 用のソースを落として使ってね!
コンパイラは、

  • PHP を IIS で使う場合は、PHP 5.3 VC9 Non Thread Safe あるいは PHP 5.2 VC6 Non Thread Safe を選びます。

  • PHP 5.3 以降を IIS7 以降で使う場合は、VC9 版のバイナリを使わなければなりません。

  • PHP を Apache 1 あるいは Apache 2 で使う場合は、PHP 5.3 VC6 あるいは PHP 5.2 VC6 を選びます。

だそうです・・・

このページの続きを見て思った!
あれ!?!?!

注意:

VC9 版は Visual Studio 2008 でコンパイルしており、パフォーマンスや安定性が優れています。 VC9 版を使うには、» Microsoft 2008 C++ Runtime (x86) あるいは » Microsoft 2008 C++ Runtime (x64) をインストールしなければなりません。

と書いてある・・・・
しまった、Cisual Studio 2010 しかインストールしてないよ^Д^;

これじゃコンパイラのバージョン違うからビルドできない??!!!

であれこれ調べた記事の中に、
PHP拡張モジュールを Windows でビルド
という記事でパスはよく分からなかったけど
・・・\SDK\include\main\config.w32.h
という部分の
#define PHP_COMPILER_ID "VC10"
#define PHP_COMPILER_ID "VC9"
にしてしまえば、中身はVC10 でコンパイラしたものだけど
VC9 で作った事に見せかけられるらしい!!!

と、とりあえず、開発環境今からなんか出来るだけしたくないというか、
VC10 のPHP もあった様な・・・・!?

公式の
http://windows.php.net/download/
調べてみると、VC10 でコンパイルされているのが無かったorz

PHP5.4(5.4.34)までがVC9 で
PHP5.5(5.5.18)からはVC11 だ!!!
VC10 は何処へ行ったwww
無視されてる;x;

あれ?おかしいな
Windows Build, step by step
には、
  • Visual C++ 9.0 (Visual Studio 2008) for PHP 5.3 and 5.4. You can use the Express versions as well.
あぁ、5.3と5.4 は早いコンパイラとしてVC9.0 が使えますって事か、
使える様になった!つまり、古いコンパイラでもいけるのか?


気になりまくったのでもっと知りたかったので
WikiPedia でMicrosoft Visual C++
そして他のサイトで製品別VCバージョン一覧

うん、違うかもwww

まぁいい・・・とりあえずだ、とりあえず・・・
コンパイルしてみたい・・・
動かない時には本当に入れ替えてみよう・・・
では次

と書いてあり、そこからtools を落とせとある。
       Thursday, May 12, 2011  2:06 PM      1435660 php-sdk-binary-tools-20110512.zip
Thursday, September 15, 2011 1:02 PM 2714535 php-sdk-binary-tools-20110915.zip
があるけれど、新しい方である
php-sdk-binary-tools-20110915.zip
をとりあえずダウンロードして

  1. Create the folder “c:\php-sdk“
  2. Unpack the binary-tools.zip archive (http://windows.php.net/downloads/php-sdk/) into this directory, there should be one sub-directory called “bin” and one called “script“
とあるので、
C:\php-sdk\
とディレクトリの名前を付けてその中に展開した。

次に、

Windows Build, step by step
にはWindows SDK もいるって書いてある

も見つけたが、2014/11/02現在では、Widows Server2003 Platform SDK と
Windows Server 2008 and .NET Framework 3.5 の事が書いてあった。

そういえば、私の環境は、
Microsoft Windows SDK v7.1
があり、そしてダウンロードのフォルダに
Microsoft Windows SDK for Windows 7.1 Setup があって、入っているので、
多分、
を入れているのだと思う。

Windows SDK のバージョンもPHP の説明サイトよりも新しい物が入っているということ。

Windows 8.1 のSDK もあったが、とりあえずこのマシンはWindows 7 だし、
古いSDK を使っている訳でもないので、多分・・・これもいけると思う、
他のサイトでも同様に新しいSDK v.7.1 を使っていたり、1つ前を
使っていたりするのを見かけた。

多分・・・これも何とかなる!!!???

そして公式に戻るが
Windows Build, step by step
に 「Windows SDK 6.1 shell」を開いてとあるが
私の環境は違うので、私のスタートメニューの中には
「Windows SDK 7.1 Command Prompt」というのがあって、
これが該当のコマンドプロンプトになる。

そのコマンドプロンプトから
setenv /x86 /xp /release
を実行しないといけないらしいのだが、私の環境では動かなかった。

理由は環境変数に
C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin
が通っていなかった為、SetEnv.Cmd が動いていない。

なので環境変数でパスを通す必要がある。

コンピューターのプロパティ、Windows 7 ではシステムとセキュリティ>システム
(PauseBraak キー + Windows キー でも行けます)
画面にある、設定の変更ボタン=>詳細設定タブ=>環境変数ボタン

こちらのシステム環境変数の中の変数がPath になっている、
※既存のPath の内容を消さない様に※、追加で ; で区切って
;C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin
を最後の部分に追加します、それでPC 再起動。

これで、C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd
が動きました。

ちょっと余談、setenv がなんでWindows のコマンドなんだ!!!とか思って、
とりあえず調べてみた、あと引数が/xp とか /release とか何だ?!!!とかも
ここに載っていた
http://msdn.microsoft.com/en-us/library/ff660764(v=vs.100).aspx


続いて
  1. bin\phpsdk_setvars.bat
    bin\phpsdk_buildtree.bat phpdev
を行い
ディレクトリにphpdev などを作ります、
.bat の中身は、一時的に変数をセットしたりディレクトリを作る内容などでした。

次に
  1. Now extract the PHP source code to C:\php-sdk\phpdev\vcXX\x86 with your favorite unpacker (7-zip should handle it) where vcXX is the compiler version you are using. For example C:\php-sdk\phpdev\vc11\x86\<php-source-directory>
とあり、これは、
ソースのダウンロード先
http://windows.php.net/downloads/php-sdk/
で7-zip 形式(解凍は、参照① などで)のものをダウンロードしてくる。
私の場合には、
Monday, September 15, 2014 10:00 PM 20574717 deps-5.3-vc9-x86.7z
というのをダウンロードしてきた。

これを展開するとdeps というフォルダが出来るので、
今回本当は、VC10 だけど、VC9 であると擬似的に変えるので、
それをVC9 のx86 である
C:\php-sdk\phpdev\vc9\x86\
deps-5.3-vc9-x86.7z の中身をdeps というフォルダにコピーした。

その時に、見本みたいな、deps が元々あるが
これは多分必要ないのでリネームしてdeps_ にしておいた。

というかリネームしたが、要らないので上書きでもいい。

次に、私のPHP のバージョンが、PHP5.3.5 であったので、
これに合わせて
http://php.net/releases/
もしくは
http://php.net/downloads.php
だと思ってたら、リンクのアンカーはある物の、リンク切れ・・・
This service is unavailable at the moment. Please try again in a day
と表示される・・・

よく読んだら
Get PHP via git or a snapshot (do not extract yet!)
と書いてあったので、このgit か snapshot 
から持ってくるみたい?です。

でもってでもって、
snapshot  も、
This service is unavailable at the moment. Please try again in a day
もリンク切れ・・・

git  からだけなんだ???
該当のファイルを探してダウンロードします。

私の場合は でした。

ポチッ!っとダウンロード
This service is unavailable at the moment. Please try again in a day
いい加減にしてくれ^w^;
そもそも
http://museum.php.net/xxxxxx ってもう
This service is unavailable at the moment. Please try again in a day
なサーバーorz

色々いじってて分かったwwww
結果的に何処かのリンクには乗ってない、現状のリンク先のディレクトリを探ってみると
今は
http://windows.php.net/downloads/releases/
からしかダウンロードできない@w@#

でもって、PHP5.3.5 は節目のバージョンじゃなかったのか
http://windows.php.net/downloads/releases/archives/
アーカイブに該当のソースを見つけました!

      Tuesday, March 22, 2011  1:58 PM     20281963 php-5.3.5-src.zip

よく見ると、コンパイル済みの方は
      Tuesday, March 22, 2011  1:57 PM     24996864 php-5.3.5-nts-Win32-VC6-x86.msi
Tuesday, March 22, 2011 1:57 PM 13763420 php-5.3.5-nts-Win32-VC6-x86.zip
Tuesday, March 22, 2011 1:58 PM 28206592 php-5.3.5-nts-Win32-VC9-x86.msi
Tuesday, March 22, 2011 1:58 PM 15691368 php-5.3.5-nts-Win32-VC9-x86.zip

      Tuesday, March 22, 2011  1:59 PM     25115648 php-5.3.5-Win32-VC6-x86.msi
Tuesday, March 22, 2011 1:59 PM 13908109 php-5.3.5-Win32-VC6-x86.zip
Tuesday, March 22, 2011 1:59 PM 28335616 php-5.3.5-Win32-VC9-x86.msi
Tuesday, March 22, 2011 1:59 PM 15833206 php-5.3.5-Win32-VC9-x86.zip
があるのですが、nts とインストーラー形式の違い以外に、VC6 とVC9 の
コンパイルが選べた事に気がついたのですが、自分がVC6 でコンパイルされた物を
使っているのは分かっています。

しかし、XAMPP のxampp-win32-1.7.1.zip
は、
PHP 5.2.9 (cli) (built: Feb 25 2009 15:52:24)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technol
ogies
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies
となるので、PHP5.2.9 そうすると、以下の様に
      Tuesday, March 22, 2011  1:43 PM     17531904 php-5.2.9-nts-Win32-VC6-x86.msi
Tuesday, March 22, 2011 1:43 PM 10411799 php-5.2.9-nts-Win32-VC6-x86.zip
Tuesday, March 22, 2011 1:43 PM 17705984 php-5.2.9-Win32-VC6-x86.msi
Tuesday, March 22, 2011 1:43 PM 10512387 php-5.2.9-Win32-VC6-x86.zip
VC6 でコンパイルしたものしか無いんですよね

ならば自分がVC6 でコンパイルされたPHP5.3.5 を使っているので
メッセージを見る限り、
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
でmodule の違いはコンパイラの違いだと思っていましたが、
このAPI とは、PHP のバージョンの違いもやはり示しているという考えが
正しいのかもしれません。

話は少しそれますが、不思議なディレクトリを見つけましたのでディレクトリメモ・・・・w
http://windows.php.net/downloads/php-sdk/deps/vc9/x86/
うーん・・・SDK???? まぁいいや、後回し^^;

それで話は戻って、先ほどダウンロードしたphp-5.3.5-src.zip
これを解凍すると、php-5.3.5-src\php-5.3.5 というディレクトリ階層で
php-5.3.5 が出来るので、これを
C:\php-sdk\phpdev\vc9\x86\ にコピー
このディレクトリには、
C:\php-sdk\phpdev\vc9\x86\deps\
があるディレクトリである、つまり、
C:\php-sdk\phpdev\vc9\x86\php-5.3.5\
が出来ます。


ここで色々ネットで調べた情報によると、PHP本体のコンパイルには、calendarの拡張フォルダにある
jewish.c というソースにヘブライ語が含まれているみたいで、
これがコンパイルを失敗させるそうです。

yoyaのメモ - PHPソース中のヘブライ語
ISO-8859-8 のヘブライ文字の領域が MSB が立ってて SJIS の1byte目と誤解されてる件の対処なので、8bit スルーさせれば解決する。はず。
と書いてあって、具体的にPHPで変換するスクリプトの一部があった。



その先に結果があったので、それを自身の変数char *JewishMonthHebName[14] 
の部分に貼ることにした。

内容は書いておかないとメモにならないので頂いてきました@x@;
ご自身で変換するのならば、PHPスクリプト一部は上記のyoyaさんのページで見て下さい。
char *JewishMonthHebName[14] =
{
    "",
    "\xfa\xf9\xf8\xe9",
    "\xe7\xf9\xe5\xef",
    "\xeb\xf1\xec\xe5",
    "\xe8\xe1\xfa",
    "\xf9\xe1\xe8",
    "\xe0\xe3\xf8",
    "'\xe0\xe3\xf8 \xe1",
    "\xf0\xe9\xf1\xef",
    "\xe0\xe9\xe9\xf8",
    "\xf1\xe9\xe5\xef",
    "\xfa\xee\xe5\xe6",
    "\xe0\xe1",
    "\xe0\xec\xe5\xec"
};

yoyaさんに感謝!

それで私の場合、該当箇所は
C:\php-sdk\phpdev\vc9\x86\php-5.3.5\ext\calendar\jewish.c
です。元のjewish.c はとりあえず、jewish - ヘブライ語を直す前.c とかにして
中身をVisualStudion2010 で開くと保存形式が変わるからどうとか言ってきて
信用ならないので、私はNotepad++(参考: ) で開いて該当箇所を直しました。

では続き
Change directory to the location of your PHP source code:
  1. cd C:\php-sdk\phpdev\vcXX\x86\php-source-directory
とあるので、私の場合は
C:\php-sdk\phpdev\vc9\x86\php-5.3.5
になるので、
cd C:\php-sdk\phpdev\vc9\x86\php-5.3.5
をしてカレントディレクトリを変える

Setting SDK environment relative to C:\Program Files\Microsoft SDKs\Windows\v7.1
\.
Targeting Windows XP x86 Release

C:\Program Files\Microsoft SDKs\Windows\v7.1>cd c:\php-sdk\

c:\php-sdk&gt;bin\phpsdk_setvars.bat

c:\php-sdk>REM phpsdk.bat

c:\php-sdk>bin\phpsdk_buildtree.bat
phpdev c:\php-sdk>cdC:\php-sdk\phpdev\vc9\x86\php-5.3.5

C:\php-sdk\phpdev\vc9\x86\php-5.3.5>
続きからだと上記になる


出続きを見ると
Run:
  1. buildconf
とりあえす、buildconf.bat を実行するらしい。
やってみたら、

Rebuilding configure.js
Now run 'configure --help'
あれ?
なんか、buildconf じゃなく、configure のヘルプを見ろと出るっぽい
そして次の項目は
To get an overview of the compiling flags:
  1. configure --help
おんなじw
先に見ればよかったんじゃないの?これw


configure --help
やってみた
Options that enable extensions and SAPI will accept 'yes' or 'no' as a
parameter. They also accept 'shared' as a synonym for 'yes' and request a
shared build of that module. Not all modules can be built as shared modules;
configure will display [shared] after the module name if can be built that
way.
 
~~~~略~~~~

いやもう、多すぎたので略しましたw
何を含めてコンパイルするかって言われてもなぁw
PHP のマニュアルをネットで探した方が良さそう^^;

一番初め、とりあえず
configure
だけしてみたけどダメで
C:\php-sdk\phpdev\vc9\x86\php-5.3.5>configure --disable-all --enable-cli
したら、かなり長いので載せないですが、チェックとか、
Enabled extensions とかでMode がstatic なのかとか
SAPI はcgi とcli が名前に入っているから有効だなとか
コンパイルのバージョンとかが出てきた。


最後の行で
Type 'nmake' to build PHP
と出たので、
とりあえず、nmake してみたら、

warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
だらけwwwwwwwwwwwww

でもとりあえず、
出来上がってるっぽい!!!!
C:\Users\classic>C:\php-sdk\phpdev\vc9\x86\php-5.3.5\Release_TS\
を見るとphp.exe やら、php-cgi.exe やらあります;w;

やった!

とりあえず、普通にコマンドプロンプトでテストしてみる
C:\Users\xxxxx>C:\php-sdk\phpdev\vc9\x86\php-5.3.5\Release_TS\php.exe -r "echo
 'はろーわぁーるど';"
はろーわぁーるど
C:\Users\xxxxx>C:\php-sdk\phpdev\vc9\x86\php-5.3.5\Release_TS\php.exe -v
PHP 5.3.5 (cli) (built: Nov  4 2014 09:34:27)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

うっ、動いてる・・・!!!!!

わっ、私のしたい事は、PHP をコンパイルしたかった訳じゃない^w^;

拡張の、php_bcompiler.dll

を、どのバージョンでも作れる様になって、
とりあえず自分が使っている、PHP5.3.5 で使える様にしたかったのだ・・・

まだ道のりは遠い@@;

半分くらい。。。

後半の2/2(まだありません! 少々お待ちを・・・・orz)に続く

拍手[0回]


No Image

PHPでアドレスチェックは正規表現使わないでもフィルター関数(filter_var)で出来る部分があるのを知った

PHP の調べ物

メモです@x@

filter_var() という関数を使うと
正規表現を使わないでも
http://www.faqs.org/rfcs/rfc2396.html
で規格化されているスキーマ(scheme) に関しては
チェックできるのが分かった!
http://php.net/manual/ja/function.filter-var.php

このfilter_var()という関数は
メールアドレスや、URI 、IPアドレスにも対応していて
細かく指定をするのならば
http://php.net/manual/ja/filter.filters.validate.php

にあるID だけでなく、フラグの部分も第三引数として追加すれば
もっと細かく指定できるみたいです@@

それで一応ちょっとPHP 公式のメモにあったのに少し付け足してテストしてみた。

$filterTestArray=array(
        
'ftp://ftp.is.co.za.example.org/rfc/rfc1808.txt',
        
'gopher://spinaltap.micro.umn.example.edu/00/Weather/California/Los%20Angeles',
        
'http://www.math.uio.no.example.net/faq/compression-faq/part1.html',
        
'mailto:mduerst@ifi.unizh.example.gov',
        
'news:comp.infosystems.www.servers.unix',
        
'telnet://melvyl.ucop.example.edu/',
        
'http://www.ietf.org/rfc/rfc2396.txt',
        
'ldap://[2001:db8::7]/c=GB?objectClass?one',
        
'mailto:John.Doe@example.com',
        
'news:comp.infosystems.www.servers.unix',
        
'tel:+1-816-555-1212',
        
'telnet://192.0.2.16:80/',
        
'urn:oasis:names:specification:docbook:dtd:xml:4.1.2',
        
'http://aaaaaaaa.aa.aa',
        
'http://aaaaaaaa.aa.aa/',
        
'callto:123-456-789',
        
'callto:123-456-789/',
        
'skype:111-222-444',
        
'skype:123456789'
);
foreach(
$filterTestArray as $oneFilterTestString){
    echo 
'['.$oneFilterTestString.']=><br>';
    if(
filter_var($oneFilterTestString,FILTER_VALIDATE_URL)){
        echo 
'['.filter_var($oneFilterTestString,FILTER_VALIDATE_URL).']<br>';
    }else{
        echo 
'false!!!<br>';
    }
}

結果は

[ftp://ftp.is.co.za.example.org/rfc/rfc1808.txt]=>
[ftp://ftp.is.co.za.example.org/rfc/rfc1808.txt]
[gopher://spinaltap.micro.umn.example.edu/00/Weather/California/Los%20Angeles]=>
[gopher://spinaltap.micro.umn.example.edu/00/Weather/California/Los%20Angeles]
[http://www.math.uio.no.example.net/faq/compression-faq/part1.html]=>
[http://www.math.uio.no.example.net/faq/compression-faq/part1.html]
[mailto:mduerst@ifi.unizh.example.gov]=>
[mailto:mduerst@ifi.unizh.example.gov]
[news:comp.infosystems.www.servers.unix]=>
[news:comp.infosystems.www.servers.unix]
[telnet://melvyl.ucop.example.edu/]=>
[telnet://melvyl.ucop.example.edu/]
[http://www.ietf.org/rfc/rfc2396.txt]=>
[http://www.ietf.org/rfc/rfc2396.txt]
[ldap://[2001:db8::7]/c=GB?objectClass?one]=>
[ldap://[2001:db8::7]/c=GB?objectClass?one]
[mailto:John.Doe@example.com]=>
[mailto:John.Doe@example.com]
[news:comp.infosystems.www.servers.unix]=>
[news:comp.infosystems.www.servers.unix]
[tel:+1-816-555-1212]=>
false!!!
[telnet://192.0.2.16:80/]=>
[telnet://192.0.2.16:80/]
[urn:oasis:names:specification:docbook:dtd:xml:4.1.2]=>
false!!!
[http://aaaaaaaa.aa.aa]=>
[http://aaaaaaaa.aa.aa]
[http://aaaaaaaa.aa.aa/]=>
[http://aaaaaaaa.aa.aa/]
[callto:123-456-789]=>
false!!!
[callto:123-456-789/]=>
false!!!
[skype:111-222-444]=>
false!!!
[skype:123456789]=>
false!!!

つまり、
http://www.faqs.org/rfcs/rfc2396.html
のRFC に準拠していないスキーマはfalse になっちゃうみたいです。

それ以外は使えるみたいです。

メールアドレスは試していませんが、
これを使うと楽かもしれないな!と思いました。

一応メモでした
お粗末<_ _>

追伸:
因みにIPv6とIPv4 の例は
http://www.w3schools.com/php/filter_validate_ip.asp
にありました!

拍手[0回]


No Image

PHP の構文機能 変数の文字列(string)を関数名に出来るとは(゜o゜)

PHP の調べ物

PHP の構文で最近、PEAR の中身を見て知った機能?書式

関数の名前を変数で指定してみると
$funcName="var_dump";
$funcName('true');


こう書くと

string
 'true' (length=4)

こうなる!


$$で指定した変数の中身を変数名に出来るのは知っていたが
こうやって変数の持つ文字列の値を関数名にも出来るなんて知らなかった(゜o゜)!!!


忘れる前の( ..)φメモでした

お粗末<_ _>

拍手[0回]


No Image

PHP のスクリプトをfopen などで呼び出すと、途中終了、終ってしまう未知のecho(print)エラー

PHP の調べ物

メモです。

何時間もかけて突き止めた、バグに近い?エラーです。

fopen などで、自分のサイトへhttp のphp スクリプトを呼び出す時、
呼び出す側の中に、echo を書いてはいけません。

これをしていると、
その部分で止まってしまう事を確認しました。

echo を動く場合と動かない場合があって、
今まで気がつかなかったですが、
多分バージョンによっても動く動かないは
あるかもしれませんが、止まるケースはあります。

例)

a.php で、
if($fp = fsockopen($host,80,$errno,$errstr,2)){
$req = "HEAD ".$host_dir.$q." HTTP/1.1\r\n";
$req .= "Host: ".$host."\r\n";
$req .= "Connection: Close\r\n\r\n";
fwrite($fp, $req);
stream_set_timeout($fp, 2);
fclose($fp);

みたいな内容で、
b.php を呼ぶと時、

b.php 内にecho をしてはいけないと言う事です。

これの判断に、
b.php のecho の前方と後方で

$fp_debug = fopen($fileOpenPath_and_fileName, 'a+'); //指定のパスのファイルネームがあれば追記モードで開き、無ければ作成
fwrite($fp_debug, $saveString); //一行書き込み
fclose($fp_debug); //ファイルの書き込み終了

の様な(例は関数化しているので引数が変数ですが)付け加えた結果、前方はOKですが、後方は
ログすら残りません。

多分、エラーとか、タイムアウトとか、出力先が曖昧になるのでしょうか、
それともLinux が相手のポートを把握できないので、止まるのでしょうか、
色々考えられますが、とりあえずphp のページをfopen なので80 ポートを
用いて呼び出して実行する時には、気をつけなければいけません。

php スクリプトをphp スクリプトで呼び出す場合のデバッグの方法は、
ob_xxx 系関数を用いて、ブラウザでデバッグ出力してとか、
色々考えられますが、直接呼んだのか、間接的に呼んだのかなどが
判断できる、例えばip アドレスとか、ブラウザのユーザーエージェントで
判断するとか、色々考えられますが、
やはりecho やprint は使わないのが手っ取り早いでしょう。


とかいう、個人的なメモでした。

拍手[0回]


[PR]