不正なメールアドレスを見抜く正規表現

  • 2009/02/12(木) 00:00:00

お知らせ

大事なことなのでもう1回だけ言わせてください><
1月22日よりこのブログのURLが変わりました。
1月22日より 新しいURLになります - DTIブログお知らせ版

新URL、RSSはこちら。よろしくでござる!
http://lovecall.dtiblog.com/
http://lovecall.dtiblog.com/?xml



はじめての正規表現

メールフォームを作った。その全貌は紙面の都合上、別途、日を改めて。
ユーザーが入力したメールアドレスをチェックするときに正規表現が出てきたので、
先にこのヤマに取り掛かる(`・ω・´)


if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $text))

正規表現:メールアドレスかどうか調べる


preg_matchは、正規表現によるマッチングを行う関数のこと。
preg_match("/パターン/", 調べる文字列) の形式。

メールアドレスのチェックで正規表現のお勉強 - moz'B


正規表現についてはここがすごく分かりやすかった!
サルにもわかる正規表現入門


^
は行の先頭、$ は行の最後を意味する。
(カッコ) で半角英数字をグループ化、+ は直前文字の1個以上の繰り返し。
で正規表現の特殊文字(メタキャラクタ)をエスケープして、その文字が1個以上連続、
あるいはそれ以上続かないところで @ が入る。


・・・と、ドンピシャな記事を見つけて喜んでいたが、よく調べたらサイボウズラボの秋元さんが
「使っちゃだめよ」と言っていた(´・ω・`)
# この指摘を受けて、phpspotさんは該当記事を修正し、訂正記事を書かれています。


これは、"example@so-net.ne.jp"とか"example+tracer@gmail.com"をメールアドレスではないと
判定する。この簡単さだと、メールアドレスじゃないものを通してしまう取りこぼしも多いはず。

phpspotの人は正規表現について語らないほうがいいのでは - 秋元@サイボウズラボ・プログラマー・ブログ

Σがびちょん!そ、そうなのか・・・。Gmail の +(プラス)アドレスを弾くサービス多いよね><
メールアドレスの正規表現チェックで「+」を許容してほしいってF.Kojiさんも言ってた!
+(プラス)を通すには、/^([a-zA-Z0-9])+([a-zA-Z0-9._-+])*@ にすればいいのかな?
うん、+(プラス)は通った。でも本当の本当は、もっとがっつり書かなきゃダメらしい。
これが正解。
Perlメモ - メールアドレスの正規表現

長!!!!!!!!!っっっ!
「ウォーリーをさがせ」みたいなことになっている・・・@ はどこだろう・・・
正しい正規表現って難しいなぁ。正しい正規表現って表現はおかしいなあ。


まだ正規表現のさわりしか分かってないけど、これだけでも fuba さんが極めて困難な局面にあると
いうことが理解できたので、自分にとっては大きな進歩である。うれしうぃっしゅ。

 


最後に、参考リンクに感謝!
正規表現でメールアドレスかどうかチェックする
正規表現でメールアドレスを表現しよう
バリデーションなんて要らなくね?


LINEで送る

初心者向けPHP練習問題リンク+学習ログ

  • 2009/02/04(水) 00:00:00

日記

もうすぐにぽたんの誕生日なので本気出す。



PHPの基本を復習しよう

自分は今まで参考書とGoogleを頼りにコードを書いていたが、
何かを見ながらだとなかなか覚えないよね><

ある程度、基礎的なことを理解したら(ってまだ理解してないんだけどドント・マインド)、
計算ドリル的なノリで、1000本ノックをするべし!するべし!!

で、PHPの簡単な練習問題を探してみた。
私はとても役に立ったので、PHPを勉強中の初心者の方には是非&ぜひオススメしたい!
以下、易しい順にリンク張っておくにょ。


PHP基礎問題集(PreAlphaVersion) - 初心者のプログラミング体験記
# 基本中の基本をシンプルに復習。
 もうちょい難易度が高い練習問題もあるけど、私はそっちはやってないw

練習問題 - プログラミングスレまとめ in VIP
# これはなんとPHPの解答例が載っていないというまさかの村八分( ;Д;)

【お題】PHP学習課題スレ【出せや】 - WEBプログラミング@2ch掲示板
# これは良かった。
 疲れたときの3時のおやつには 『今の自分の心境をPHPで表すスレ』 がイイ!

新しくプログラミング言語を覚えたいときに行うべき10の練習問題 - IDEA*IDEA
# ひゃ!



復習を兼ねた感想など(長いので適当にスルーしてくださいナ)

配列いじり † (練習問題 - プログラミングスレまとめin VIP)
配列の先頭はそのままに、先頭以外の要素をすべて0に置き換える。

例: 置換前 3 5 2 4 2

   置換後 3 0 0 0 0



べにぢょの答え

<html>
<head>
<title>PHP練習問題 - 配列いじり</title>
</head>
<body>

<?php

$num = array(3,5,2,4,2);
foreach($num as $line){
echo $line;
}

echo "<br>";

$change = array(5,2,4);

$new_num = str_replace($change,0,$num);

foreach($new_num as $line){
echo $line;
}
?>

実行結果: 配列いじり - PHP練習問題

私の解釈は、出題者の意図とちと違っているような・・・。
確かに相違なく表示されているが、この問題ではこの方法の理解が問いたかったのだろうか?
うーむ。.....まぁいいか!!


一言メッセージ×10行のチャット、名前入力必要なし。 【お題】PHP学習課題スレ【出せや】 の >>11)

これは分からなかったので、>>12の解答をググりながら解釈。

<?php
$log = @file('chat.log');
 //chat.logを読み込んで$logに代入

if(!is_array($log)){ 
//$logが配列じゃなかったら
$log = array(); 
//配列にする
}

if(isset($_POST['monolog'])){ 
//$_POST['monolog']がセットされていたら
array_unshift($log, $_POST['monolog']."<br>"); 
//$logの先頭に$_POST['monolog']を追加

$log = array_slice($log,0,10); 
//$logの0番目から10番目までを取り出す

file_put_contents('chat.log',$log); 
//chat.logに$logを書き込む

header("location:2ch_12.php"); 
//リダイレクト
exit;
}
?>

<html>
<head>
<title>10行チャット - PHP学習課題スレ</title>
</head>
<body>
<p>10行チャット<br>
<form method = "POST" action = "2ch_12.php">
<input type="submit" value="送信">
<input type="text" name="monolog">
</form></p>

<?php
foreach($log as $idx=>$value){ 
//$logの要素を$valueに代入
echo "<hr>".$value; 
//$value表示
}
?>
<hr>
</body>
</html>



スレの解答例にはエスケープなかったけどいいのかな。
それと、ファイルを操作するときはロックをしないとまずいというのをどこかで読んだような・・・
どうなんだろう、この場合は要らないんだろか。
初心者がイキがって余計なことしない方がいいかな><と思ったが、せっかくの機会なので書いてみる。


べにぢょの答え(変更してない箇所は省略)

if(isset($_POST['monolog'])){
$post = htmlspecialchars($_POST['monolog'], ENT_QUOTES);
 //array_unshiftする前にエスケープ
array_unshift($log, $post."<br>");



さて、問題はどこでファイルにロックをかけるかだが・・・
$log = @file('chat.log'); の次はダメだ。
@flock($log,LOCK_SH); としたいところだけど、flock の第一引数はファイルポインタなので、
chat.log の内容を配列で読みこんだ $log は引数にできない。
となると、次にファイルに対してアクションを起こすのは file_put_contents('chat.log',$log);

だがしかし!こやつは開く&書き込むを1人でやってしまうので、止めに入る間がない。
くそぅ・・・万事休すか・・・・っ と思ったら、フラグていうのがあるらしい(゚∀゚)
じゃあ、これでいいのかな?

file_put_contents('chat.log',$log,LOCK_EX);
実行結果: 10行チャット - PHP学習課題スレ

ほ。とりあえずエラーは出ていない。
1人でチャットしながらコード直していったので、記念に貼っておく!

  


あ、そうだ。
下から2番目の「属性なの?」という発言について。
最初、「てすとだ」 とだけ書き込んだ chat.log をサーバーにUPしたのね。
そのあとフォームに 「ハローワールド!」 と入力して送信したんだが、何度リロードしても一向に変化なし。
「おい!聞いてるのか!!!」・・・なんて昔の私だったらキレるところだけど、
実はうすうすできない気がしていた。
アレだろ?パーミッションだろ?やっぱりな!そうくると思ってたぞ。
chat.log の属性を 666 に変えて、「属性なの?」 と入力してみる。
ほらキタ!書けた書き込めた!まいったか!
・・・という知られざるストーリーがあったのだった。とっぴんぱらりのぷぅ。



2ちゃんねるのスレなど見ていて思ったけど、他人が書いたコード見るのってちょっと楽しいね。


LINEで送る

年齢は3行で割り出せるぞ!

  • 2008/11/12(水) 23:00:00

日記

ハロー。昨日は妹の誕生日だったよ。21歳になったらしいよ。
「そろそろ今のカレシと結婚を考えてる」 て相談されて、ショックを隠しきれないよ/(^o^)\
わきまえろ!じちょうしろ!!いもうとなんてきらいだ><


今日の日付と誕生日を使って、3行で年齢を計算する方法

11月12日は、自重しないことで有名なござ先輩の誕生日!
私のときはエントリで祝福してもらったので、今度は私が おしおき おかえしするよ!

ござ先輩へ

最初は php だけで書いたため、タイトルが入ってなかった。
どうもかっこわるい。SEO 的にも良くないはず(`・3・)

とゆことで、タイトルだけ設定したい。
html のなかに php を入れてもいいんだが、せっかくなので違うやり方にしてみる。
一回目は <html><head>〜</body></html>まで書いたんだけど、
試しに省いてみたら問題なかったので削除。

print <<< end
<title>
ござ先輩、ハッピーバースデー!
</title>
end;


ヒアドキュメントは、PHP内にまとまった文章を直接記述し利用できるようにする方法です。

PHPのヒアドキュメント


そしてここからphp。なんと3行しかない。

$now = date('Ymd');
$birth = "19791112";
echo "ござ先輩、".floor(($now-$birth)/10000)."歳のお誕生日おめでとう!";

参考にしたエントリ:年齢の計算

1行目。
date() で現在の日付を取得して $now に代入。久々みたdate。前に使ったことがあるような。
9日目 カレンダを作ルンダ♪

date 関数は、フォーマット(型)を指定して日付・時間を出力する関数。
PHP 日付・時間関数の使い方


Y だけ大文字なのは理由がある!大文字の Y は 4桁の数字、小文字の y は 2桁の数字なのだ。
PHP : date - manual


2行目。
$birth に、ござ先輩の誕生日を西暦4桁と月日2桁で代入。
この1行は別々に出力してもよかったんだけど、3行で済ませたかったので .(ピリオド)でくっつけたw
ピリオドは文字列を連結させるそうな。9日目 カレンダを作ルンダ♪より)


3行目。
floor()は、引数で指定された値を小数点以下で切り捨てる関数です。
PHP関数講座:floor -- そふぃのphp入門

つまり、今日の日付 20081112 から 19791112 を引いて 10000 で割った値の小数点を切り捨てる関数。
今回はぴったし29で割り切れるけど、たとえば昨日、誕生日を迎えた私の妹の場合だと
21.0001 になっちゃう。
そんなときに「21.0001歳のお誕生日おめでとう!」と表示されたら恥ずかしいので、
小数点以下を切り捨ててくれるんだな!ありがとう!


これは誕生日以外の何かの記念日にも使えるね(・∀・)
たとえばこんな感じにも♪

あちゃみん&ダンニャ様へ
参考エントリ:いまいましいうらやましいデート日記><

LINEで送る

タイでエビを釣ろうぜ!2.0

  • 2008/05/11(日) 18:30:00

関連:タイでエビを釣ろうぜ!


zapaさんからついったーでご指摘いただいたのでエントリ。
つまり、ギークに脆弱性を突かれたわけだ!!(違




早速、直そうと思ったが、やぱりまずはしくじる。

$ary_ebi=array('<img src=" エビ jpg"," えびちゃん jpg"," 海老蔵 jpg">');


エビ画像しか表示されない件(・c_・`)
で、ついったーで再びアドバイスを頂戴して、ででで・け・たヾ(゚∀゚*)ノ

$ary_ebi=array("エビ.jpg","えびちゃん.jpg","海老蔵.jpg");


にして

<img src="<?php print($ary_ebi[0]);?>">


の方がスマート。なるほど。ほのかに香るナイスギーク臭。
zapaさん、超ありがとうございます!あなたは私のエビです!褒めてます!ありがとうありがとう!!


さて。今日気付いたこと。
べにぢょって日曜ヒマなんだな・・・・・・・・・・・。

LINEで送る

タイでエビを釣ろうぜ!

  • 2008/05/11(日) 00:00:00

日記

 あいつもこいつもあのエビを!ただひっとつ狙っているんだよ!

 先日、行った中華料理屋さんのエビがあまりにもおいしかったので、
 敬意を表してなんか作る(`・ω・´)


 エビうめぇwwwwww
  ↓
 この思いのたけをPHPにぶつけタイ!
  ↓
 はっ。タイ?そうだ、エビでタイを釣ればいんじゃネ?
  ↓
 だがちょっと待って欲しい。紅が釣りたいのはタイではなくエビである。
  ↓
 そうか!タイでエビを釣ればいいじゃないξ*´∀`)ξ


 勉強する気もしない気も!このエビにかかっているんだよ!
 もしダメならこの紅は!もうグレちまうよ><





タイでエビを釣ろう♪

あ。たいしたことはしてないど。
おみくじの時と同じ要領で、配列を使ってランダムに画像を出力しただけなので。
ただ、エビを賞賛したかったのだ。そんだけ!
タイでエビを釣ろうぜ!
ではソース。
※タグの最初は全角にしてあります。

ebi.php

<html>
<head><title>タイでエビを釣ろうぜ!
</title></head>
<body>
<form method="POST" action="ebi_output.php">
  タイでエビを <input type="submit" value="釣る!" />
</form>
</body>
</html>


いつもの感じ。


ebi_output.php

<?php
//各エビデータを格納
$ary_ebi=array('<img src="画像URL1">','<img src="画像URL2">','<img src="画像URL3">');
shuffle($ary_ebi);
?>
<html>
<head><title>釣れた釣れた!</title></head>
<body>
<?php print($ary_ebi[0]);?>
が釣れました!
</body>
</html>

Yes。おみくじの時と同じ感じ。
4日目 おみくじとか作っちゃうかモナー!



新しいことは何もしていない。がっ。
最初 ”PHP 画像 ランダム 表示” などでググったらいろいろ出てきてテンパった。
しかもさああ。
いっちゃん初めは、おみくじと同様、連想配列を使おうかなと思ったのね。
で、内心うすうす「ぜってーちがうだろなー(;・∀・)」と思いつつ、下記のような方法をガッテンした。

<?php
//各エビデータの用意
$ary_ebi=array("エビ","エビちゃん","海老蔵");
$ary_img=array(
"エビ"=>print('<img src="画像URL1">',
"エビちゃん"=>print('<img src="画像URL2">',
"海老蔵"=>'<img src="画像URL3">');
shuffle($ary_ebi);
?>

これはひどい。あんまりだ。=> のあとに print っておかしくネ?
その後、よく考えたら連想配列じゃなくても EE JUMP !と気付き、普通の配列に変更。
その方法でも、最初はワケの分からんコードを書いた。

<?php
//画像出力を変数に代入
$ebi1='<img src="画像URL1">';
$ebi2='<img src="画像URL2">';
$ebi3='<img src="画像URL3">';
//エビ変数を格納
$ary_ebi=array($ebi1,$ebi2,$ebi3);
shuffle($ary_ebi);
?>

だって!待って!話を聞いて!!
img タグはそのまま置けないと思ったんだよう!!何かに入れないとムリぽだと思ったんだよう!
これはこれで OK だったが、へっぽこギーク臭を拭えないコードだったので、
「だってダメなんでしょう・・・?」 とダメもとで配列に入れてみたら出来た。なんだよう(`・3・)


ギークな力武健次さんについったーで
「自分の失敗は他人の勉強にもなるから,できる範囲で書いておくことは大事だと思います.」
とありがたいアドバイスをいただいたので過程も書いてみた。
ホントはリアルタイムで晒していきたいが、うまい方法が見つからないのが悩ましい。
ついったーに投げようかとも思ったけど、文字数などを考慮すると微妙なところ。
ううむ。要検討。


LINEで送る