小飼弾様、正規表現の件、やってみたけどできません

正規表現って、プログラミング言語間の差が少ないサブ言語なのに、なぜ「PHP」がつくとダメ正規表現ばかり登場するのか。うんざりだ。

404 Blog Not Found:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ

< /blockquote>

メールアドレスの正規表現の正しい記法が紹介してあって、なるほどと思い自作中のPHPフォームに使おうとしてみたのですが、エラーになってしまいます。

$value ="hoge+hoge@aaa.com";
$pattern = "/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$/"
if(!mb_ereg($pattern,$value)) {
//エラー処理
}

エスケープされていないとかなんとか。
とりあえず、(?:~)のところ(検索しても説明が見当たらず、何を指すのかわからないのですが)を分解してみました。

$pattern = "/^(?:
(?:
(?:
(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)
(?:
\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)
)
*)|(?:
"(?:\\[^\r\n]|[^\\"])*"
)
)
)\@(?:
(?:
(?:
(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)
(?:
\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)
)*
)|(?:
\[
(?:\\\S|[\x21-\x5a\x5e-\x7e])
*\]
)
)
)$/";

10行目、「"(?:\\[^\r\n]|[^\\"])*"」のダブルクォーテーションが引っ掛かっているみたいです。 これをシングルクォーテーションに変えてみましたが、今度はこの行の[]が引っ掛かっているとか言われて、まだうまくいきません。

思い切ってここの判定だけ取っ払ってみると、エラーはなくなりましたがメールアドレスそのものの判定が失敗しているみたいです。
PHPで変数に入れ込まないで正規表現の判定をする方法ないんですかねー…お仕事があるので今日はここまで。

小飼さんの言っていることは、正しいことだと思います。
一般に配布されているPHPのスクリプトは、確かに入力項目のチェックがちょっと甘いものばかりです。
最近はPHPに限らず、ブログの記事等でtipsを見つけたら、それがどのようなものなのか、ある程度理解してから使うように努力はしています。

でも、
「それは良くない正しくはこうだこれだからPHPerは云々」と言われても、結局そのPHPerたちが使い方を理解できないのであれば単なる投げっぱなしなんですが。

私はいつもプログラミングの勉強のきっかけを与えてくれる百式さんやphpspotさんを支持します。
それが正しいか、正しくないなら与えられた時間の範囲でどう改善するかを検証するのは、記事を読んだ個々の人間の責任ですから。

小飼さんにはこちらの記事をお勧めしておきますね。

404 Blog Not Found:叱ると怒るの違い – 書評 – おとなの叱り方

追記:
PHPの場合の判定を発見。
PHP MEMO / PHPメモ – メールアドレスの書式のチェック
ってこれも長いな…w今度これも分解して、正規表現について勉強します。

----- EXTENDED BODY:

この記事をシェアする

この記事を書いた人

フロントエンドエンジニア

うぇびん

愛知県豊橋市の、荒ぶるフリーランスおばさんエンジニア。主な業務はCMSの構築、ウェブ制作全般。a-blog cms・WordPress・MTなど。マイクラ歴12年。得意な魔法はバイオだけど、そろそろ魔人さんにクラスチェンジしてフレアを撃ちたい。
個人のTwitter: @webbingstudio