2008年2月27日水曜日

 

【PHP】in_array()関数を使って複数のOR条件判定【関数】

bool in_array  ( mixed $needle  , array $haystack  [, bool $strict  ] )
配列に値があるかチェックする
引数:
mixed $needle - 検索する値
array $haystack - 検索対象の配列
[bool $strict - TRUE に設定された場合、 needle の型も確認する。 
返り値:
見つかった場合に TRUE、それ以外の場合は、FALSE を返す。
PHP: in_array - Manual

in_array()関数を使うと


if ($str == "a" || $str == "b" || $str == "c") {
  //処理
}

この処理が次のように表現できる。


if (in_array(array("a", "b", "c"),$str) {
  //処理
}

すっきり。

ラベル: ,


2008年2月25日月曜日

 

【PHP】メールアドレスをチェックする方法色々【正規表現】

正規表現によるメールアドレスの有効性のチェックは非常に複雑で困難である。
ソーシャルブックマークでも度々エントリが上位になる。

■ PHPでメールアドレスを確認する「正しい方法」(Linux Journal誌の記事より)

リンク先で紹介しているのは、以下の RFC 準拠によるメールアドレスチェック。

  1. メールアドレスは local part と domain が @ で区切られて構成されている。(RFC2822)
  2. local partは、アルファベット、数字、以下の記号 ! # $ % & ' * + - / = ? ^ _ ` { | } ~ で、ドット「 . 」で区切られている場合がある。ただし、最初、最後、他のドットの隣にあってはいけない。(つまり連続しないことということか) (RFC2822 3.2.4)
  3. local partは、 クオーテーションマーク「 " 」のなかにスペースを含むいろんな文字が入った quoted string を含むことがある (RFC2822 3.2.5)
  4. \@ などの "quoted pair" をlocal partに含むものも「正しい」が "obsolete" (RFC822、RFC2822 4.4) (RFC2822はRFC822をsupersedeしてobsoleteにした、とある)
  5. local partの最大長は 64文字 (RFC2821 4.5.3.1)
  6. domainは、labelがドットで区切られたものである (RFC1035 2.3.1)
  7. domainは、アルファベットで始まり、その後に、0文字以上のアルファベット、数字、ハイフン「 - 」が続き、最後の一字はアルファベットか数字。(RFC1035 2.3.1)
  8. labelの最大長は 63字 (RFC1035 2.3.1)
  9. domainの最大長は 255字 (RFC2821 4.5.3.1)
  10. domainは、fully qualifiedで、DNSのtype AもしくはMXレコードでresolvableでなければならない (RFC2821 3.6)

ソースは以下。

Email Address Validation


function check_email_address($email) {
// First, we check that there's one @ symbol, and that the lengths are right
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
return false;
}
}
if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
return false;
}
}
}
return true;
}

PEAR::Mail_RFC822 というのがある。

isValidInetAddress


mixed isValidInetAddress(string $data, [boolean $strict = false])

返り値: 正しければ、配列を返す。array("username","domain")正しくなければ、False。 
パラメータ:
string $data - メールアドレス
boolean $strict - メールアドレスチェックの厳格性。True の場合、英数字、ピリオド、ハイフン、アンダースコアのみ許可する

この関数は以下のように実装されている。

re: PHPでメールアドレスかどうか調べる方法


    function isValidInetAddress($data, $strict = false)
    {
        $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|¥'¥¥%¥/0-9a-z^_`{}=?‾:-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i';
        if (preg_match($regex, trim($data), $matches)) {
            return array($matches[1], $matches[2]);
        } else {
            return false;
        }
    }

メールアドレスに一致する正規表現

上記リンク先によると、実用的な「メールアドレスに一致する正規表現」はない。
正しいアドレスを通して、なるべく怪しいものをはじく正規表現は次のようなコード。


$mailre = '^[\x01-\x7F]+@(([-a-z0-9]+\.)*[a-z]+|\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])';

正しいメールアドレスのチェック方法

以前も或るメールアドレスを調べる正規表現に関するエントリが上がり、それに関連するエントリが続いた。
その時に分かったことがあって上のエントリを書いた。
上のエントリの参照元に「「ユーザーが入力したそのメールアドレスで本当に連絡が取れるかを確認したい」 という本来の要求仕様=やりたいこと=がいつのまにか「メールアドレスの書式として正しいかを確認したい」」というのがあって、なるほどと思った。
メールアドレスが有効であるか(メールが送信できる、本人確認が可能など)を求めるなら、参照元の様に
仮登録->確認メール受信->メールのURLから本登録
という手順が必要。
実際、Web サービスの殆どはそうなっているだろう。
その場合は DNSからドメインの有効性チェックをするのもやりすぎでもないのかもしれない。 ただ、単なるメールフォームで確認メールを使ったら面倒だし、敷居が高すぎてメールしてくれないだろう。
結局、プログラマがどこまで拘るかによるのかもしれない。RFC 準拠してないアドレスも取得可能だしスペルミスもあるし、確認用のメールアドレス入力を用意してもコピペしたら意味がない。
メールを送信して確認を取らないのであれば全部一緒で、XSS等の悪意ある入力だけ気をつければ良いんじゃないかとも思う。無駄な送信処理で負担は増えるけど。

ラベル: , , ,


2008年2月24日日曜日

 

Windows Vista で Telnet を使う。

Windows Vista には標準では Telnet はインストールされてない(XP では標準)。
なので、インストールする方法。

[コントロール]->[プログラム]->[プログラムと機能]->[Windows の機能の有効化または無効化]

プログラムの実行確認を求められるので許可。[Telnetクライアント]にチェックを入れる。
[Telnet サーバー]もチェックすると telnet のクライアント機能だけでなく、サーバ機能も利用できる。
[OK]ボタンをクリックすると選択した機能がインストールされ、すぐに利用できるようになっている。

参考

へーいち の うぇぶろぐ
Windows Vista で TELNET コマンドを使う
@IT
VistaでTelnetクライアントを利用する
Windows ヘルプと使い方
Telnet : よく寄せられる質問

ラベル:


2008年2月22日金曜日

 

livedoor clip からページへのクリップ数を画像で取得。

クリップ数を画像で取得する API

2008年2月21日木曜日

 

javascripttest


<script>
function p(s){
  document.getElementById('stdout').innerHTML += s + '<br>';
}
</script>
<dl>
<dt>プログラム:</dt>
<dd><textarea id="src" cols="50" rows="8">p("Hello, JavaScript!");
</textarea></dd>
<dd><input value="実行" onclick="  document.getElementById('stdout').innerHTML = '';
  document.getElementById('stderr').innerHTML = '';
  try {
    eval(document.getElementById('src').value);
  }catch(e){
    document.getElementById('stderr').innerHTML = e;
  }" type="submit"></dd>
<dt>出力:</dt>
<dd><div id="stdout"></div></dd>
<dt>エラー</dt>
<dd><div id="stderr"></div></dd>
</dl>

ラベル:


2008年2月19日火曜日

 

Amazonの商品画像あれこれ

k'conf
Amazonから取得できる画像

画像サイズや影付画像、枠付画像、ぼかし入り、文字入り…

ラベル:


 

年齢の計算

一行で年齢を計算するコード。

えせSEの1日1Hack
年齢の計算

<?php
$now = date('Ymd');
$birth = "19740821";
print "year: ".floor(($now-$birth)/10000);
?>
ITpro
生年月日から年齢を計算する簡単な計算式

式の意味は以下。

(今日の日付-誕生日)/10000の小数点以下切捨て。
// PHP で書くと
echo (int)((20070823 - 19850101)/10000);

// Perl で書くと
print int ((20070823 - 19850101)/10000);

// JAVA で書くと
System.out.println( (int)((20070823 - 19850101)/10000) );

ラベル:


2008年2月16日土曜日

 

JavaScriptによるCSSの操作

JavaScriptによるCSSの操作

ラベル:


 

【Javascript】CSSの値を取得する

DOM:window.getComputedStyle

var element = document.getElementById(“elemId”);
var style = document.defaultView.getComputedStyle(element, pseudoElt);
概要
要素の算出スタイルを返します。算出スタイルは、要素に対して適用される全ての CSS プロパティにおいて最終的に算出された値です。 pseudoElt は、マッチさせたい疑似要素を指定する文字列です。通常要素には空文字列を指定してください。
詳細
返るオブジェクトは、要素の style プロパティから返るオブジェクトと同じ型ですが、2 つのオブジェクトの用途は異なります。getComputedStyle から返るオブジェクトは、読み込み専用であり、要素のスタイルを調べるために使われます。elt.style オブジェクトは、指定する要素のスタイルを設定するために使われます。
getComputedStyle について調べてたら深みにハマったのでメモ
IE では
そもそも getComputedStyle という関数自体が存在しない
その代わり、 IE ではすべての HTMLElement が currentStyle というプロパティを持っていて、これが getComputedStyle で取得できるオブジェクトとほぼ同じ役割をする。
ということで、さっきの例は以下のようにすると IE にも対応できる。

var style = element.currentStyle || document.defaultView.getComputedStyle(element, '') 
という訳で↑これを使えば、クロスブラウザで、しかもワンライナーで getComputedStyle が使える!!テラ便利!!
サイズ値を"auto"とした場合の値の取得
Opera、Safari は正しく算出値を返す。ところが Gecko は、明示的にスタイル指定されていないものに関しては初期値を返してしまう。さらに、IE は DOM2-CSS をサポートしておらず、

var specifiedWidth = element.currentStyle.width;
としなければならないのだが、ここで返されるのは計算値ですらなく指定値だ。
そこで、非標準だが以下のプロパティを用いることが多い。なお、これらは全て CSS の width(内容ボックスの幅)とは異なることに注意。
element.offsetWidth
ボーダーボックスの幅[*2](px)。
element.clientWidth
パディングボックスの幅[*1]からスクロールバー等の幅を引いた値(px)。
element.scrollWidth
(padding-left) + (子ボックスのマージンボックス[*3] の幅の総和からマージン相殺分を引いた px 値) + (padding-right) [*1] (padding-left) + (width) + (padding-right)
[*2] (border-left-width) + (padding-left) + (width) + (padding-right) + (border-right-width)
[*3] (margin-left) + (border-left-width) + (padding-left) + (width) + (padding-right) + (border-right-width) + (margin-right) もともとこれらは IE の独自拡張で、他ブラウザのサポートもまちまちだ(かつ、ご存知のように、IE の後方互換モードでは、CSS の width をボーダーボックス幅と見なすバグがあるので、状況は複雑だ)。だが、一応は標準化作業が進められているので、そのうち問題なく使えるようになるだろう。

個人的解釈
CSSファイルなど外部からのスタイル読み込み等、実際にブラウザ表示されるページのスタイル値は下ので得られますよーってこと。ブラウザごとの算出値。 currentStyle はIE用、defaultView はSafari・Opera用。 Firefox は document.getComputedStyle でも大丈夫。 でもgetComputedStyleは読み取り専用なので、スタイルを指定するには、element.style にしましょうねーって感じ。


var style = element.currentStyle || document.defaultView.getComputedStyle(element, '') 

IE はサイズ指定がされてないものは auto値のまま計算してくれない。
auto値が知りたければ(動的な要素に高さを揃えたりとか)、下みたいな事かな。
ちなみに、Firefox には「px」とか単位つけないとダメ。


var style = element.offsetWidth || document.defaultView.getComputedStyle(element, '') .with
element.style.width = style + 'px';

結論
IE めんどい。

関連
JavaScriptでCSSスタイルを取り扱うライブラリ。
style.js - CSSスタイルを取り扱うライブラリ
上記リンクのgetComputedStyle について調べてたら深みにハマったのでメモを参考にバージョンアップ。

ラベル:


2008年2月15日金曜日

 

【Perl】Shift-JISでの日本語マッチング【正規表現】

※追記:2010/01/11
CPANが使える環境であり、新たにプログラムをモダンPerlで開発するならば以下のモジュールをする。
コメント有難うございます。
Sjis - search.cpan.org

基本的なこと。


$match = 'ゆめ';
$str = 'あけがらすゆめのあわゆき';
if ($str = ~/\Q$match\E/)  {
   print '夢見つかった!';
}

Perl では Shift-JIS の正規表現マッチングで日本語を扱う時、思い通りに行かない事がある。文字コードの解釈の問題。 なので、日本語パターンを「\Q」「\E」で囲む。それでもダメなときもあるらしい。 EUC-JP だとまだまし。

ラベル: ,


2008年2月11日月曜日

 

Javascriptサンプル・メモ

JS:iframeの内容を取得する方法 - Web Artisan Blog - ウェブ アルチザン ブログ

ラベル:


 

【Javascript】IEでonClick


<a href="javascript:void(0);" onClick="myFunc();">

IEではonClickjavascript:void(0)の組み合わせが良くないらしい。
以下の様に記述。


<a href="#" onClick="myFunc();">
<a href="javascript:void(0);" onClick="myFunc();return false">

上の方法は問題あるので、下の方法が良い。

IEでのJavascriptの動作

ラベル: ,


2008年2月6日水曜日

 

【PHP】メルマガのようにメール配信する【メール】

メールマガジンを配信したがる人多いですよね。
規模にもよりますが、専用サーバを別に準備するのが良いでしょう。 どこかのサービス使うのが良いんじゃないでしょうか。

以下、自分用メモ。
大量のメールを送信するPHPのプログラムを教えてください。 - 人力検索はてな
1回50~60件 、携帯であればもっと減らす。

解答で紹介された非商用無料ソフト
無料メールマガジン発行・管理ソフト k-sky MailinkList

PHPでメルマガなどを送る方法についての質問です。 - 人力検索はてな
sendmail、cron、PEAR::Mail_Queueなど。
PHP第2回:PHP中級(外部プログラムの実行/バックグラウンドでの実行)
- SE/システムエンジニアのIT系就職/転職/スキルアップサイト -StackAsterisk-
バックグラウンドで実行する為の system() とか

ラベル:


2008年2月5日火曜日

 

クエリと変数

void parse_str ( string $str [, array &$arr ] ) parse_ str http_ build_ query

ラベル: , ,


 

【比較】関数の値渡しと参照渡し

関数の値渡しと参照渡し、どちらが速い? - PHPの基礎体力

値渡しの場合は値のコピーが渡され、参照渡しの場合は値のアドレスが渡される。これプログラミングの常識です。単純に考えても参照渡しの方が高速ですが(略)

ふむふむ。

C語と異なり、PHPの場合、参照渡し・値渡しの違いは、値が変更された時に初めて起こる(略)

へー(゜д゜)

関数に渡した時点では、どちらもアドレスが渡されており、実行速度に差はなく、違ってくるのはその値が変更される時で、値渡しの場合に、関数内で変更された値が、関数内のローカル変数にコピーされるということのようです。つまり、値を変更しない関数ならば、値渡しと参照渡しの差はありません

ほえー(゜Д゜)

PHP実験室 - PHPの基礎体力
http://www.sound-uz.jp/php/test/index.html

似たような関数の実行速度の差とか凄い気になるよね。

ラベル: ,


 

【PHP】Eclipse【開発環境】

Eclipse は Java 開発環境プラットフォーム。プラグイン等のインストールで他の言語にも対応。デバッグとか便利。
日本語化も手動でやります。

Eclipse インストール
PHPEclipse インストール

PHP editer スタンドアローン版をPHPのプログラムに使ってたが、タブ機能とか無いので同時にたくさんファイルを開くと管理しづらい。
PHP editer 通常版はプロジェクトごとに「ppr」とかいうファイルが出来て個別ファイルにアクセスできなかったから。
インストールに手間がかかりすぎるし開発環境とか重すぎて入れたくない。
タブ機能テキストエディタでHTMLとCSSとPHPが色分けされれば一番良いんだけど。
sakura エディタのプラグインも上手くいかなかったし。
気が向いたらZend Studioも入れてみよう。

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google