2009年03月19日 18:00 [Edit]
「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
ああ、まただよ...
正規表現って、プログラミング言語間の差が少ないサブ言語なのに、なぜ「PHP」がつくとダメ正規表現ばかり登場するのか。うんざりだ。
メールアドレスは厳密にチェックしようとするとなかなか難しいのですが、簡単なチェックだったらこれでOKぽいですね。/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/
全然OKじゃない。
最初の[^0-9]
にしてからもうだめ。
メールアドレスの正規表現が一筋縄では行かないことは、ちょっとぐぐればすぐに出てくるし、しかも正規表現でマッチできるのはたかだかnobody@example.com
、すなわちaddr-spec
までで、From: Anonymous <nobody@example.com>
、すなわちmailbox
を正規表現でマッチするのは不可能なのはもう10年以上前から知られている(Perl 5.6以降の拡張正規表現であれば可能だが、それだともう狭義の正規表現からは逸脱してしまう)。
Jeffrey E. F. Friedl氏原著による 「詳説 正規表現」にはメールアドレスはネストした コメントを持つことができるので正規表現で表わすのは不可能であると 書いてあります
で、nobody@example.com
、すなわちaddr-specのみにマッチする正規表現は、以下のとおりとなる。
If you want to just check part a to see that the address is valid according to the mail header standard with a simple regular expression, you can have problems, because there are deliverable addresses that aren't RFC-2822 (the latest mail header standard) compliant, and addresses that aren't deliverable which, are compliant. However, the following will match valid RFC-2822 addresses that do not have comments, folding whitespace, or any other obsolete or non-essential elements. This just matches the address itself:my $atom = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+};Just match an address against
my $dot_atom = qr{$atom(?:\.$atom)*};
my $quoted = qr{"(?:\\[^\r\n]|[^\\"])*"};
my $local = qr{(?:$dot_atom|$quoted)};
my $domain_lit = qr{\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\]};
my $domain = qr{(?:$dot_atom|$domain_lit)};
my $addr_spec = qr{$local\@$domain};/^${addr_spec}$/
to see if it follows the RFC2822 specification.
ちなみに、これをまとめると、
という正規表現になる。ここではコピペしやすいように、textareaタグの中に入れてある。以下、それをJavaScriptで簡易チェック。
正規表現は慣れないと使いづらいですよね。しかし使えると超絶便利。よく使うパターンを覚えておいて応用を利かせていきたいものです。
誰だって間違いはおかすし、そして今や正規表現を間違えるというのは最も間違えることの多い部分でもあり、達人でもそこから逃れるすべがほとんどない以上、間違った正規表現を見つける都度「そうじゃない」と指摘し、そして指摘されたらすぐ直し、お互いにハッピーというのが本来の作法だと私は信じている。どの言語を使っていても、その点は変わらない。
でもね....これを見てくれ。
トップにくるのは、「正規表現:メールアドレスかどうか調べる - phpspot」なのである。そしてここで紹介されている正規表現、^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$
は。悪名高きda.me..@docomo.ne.jp
を引っ掛ける一方で、dankogai+regexp@gmail.com
を弾いてしまう。
これでは、
と言われても無理もなくなってしまうのではないか。
GoogleはGoogleで、ペイドリンクとかはつぶさにつぶす癖に、こういうものは対策してくれないんだろうか....悪化が良貨を駆逐していく様が悪化の一途をたどる前に。
Dan the Regular Expressionist
この記事へのトラックバックURL
開発者ってのは、知識のない人間が知識を持たずに使えるツールを作るべきだと思うが、肝心の開発者に知識がないんじゃ、救いようがない。プログラミングのテクニックやら正規表現ってのはソフトウェアの利用者でなく開発者のためにあるモノで、その情報の真偽も調べずに使う開発者が一番いただけないと思う。そういう開発者こそ糾弾されるべきで、改善されるべきは彼らだ。
たとえその情報が間違っていたとしても、善意で情報を公開している人間に暴言を吐く事に、暴言を吐いた人間のストレス発散以上の価値があるだろうか。ないよね。
せっかく知識があるのに、こういう形で公開しちゃうなんて非常にもったいないと思うが、今更こんなコメント、読んでないよね。
You are Racist
気持ちは分からなくもない。
簡単なものを紹介してとっつき易くするのは良いけれど、
割とそこで止まってしまっている紹介者が多すぎるから。
書籍にしたって、ブログと違って金払わせてるんだから、もっと言及したものも一緒に載せて置けよって思います。
ただ、とげのある言い方と言うのは、如何にそれが正論だったとしてもそれだけで受け入れられなく可能性があります。
なので、あなたの正論は至極尤もなんだけれども、
大勢の人が嫌悪感を感じたのではないかと思います。
能力の高い方だと思うので、そういうところで優しい方になれれば、鬼に金棒だと思います。
記事はとても参考になりました。ありがとうございました^^
デザインセンスは備えておられないようですね
再来年くらいに言語単位で炎上する時代終了しないかなぁ。
ネット上には分かりやすい入門サイトがいくつも
あるから読めばいいのに。
図解でみる正規表現入門
http://funcchan.blog16.fc2.com/
正規表現/PHP入門
http://www.scollabo.com/banban/php/php_15.html
フリーザにもわかる正規表現入門
http://taro4.blog37.fc2.com/blog-entry-33.html
ドコモが態度を変更させたよね。
参考→ http://neta.ywcafe.net/000976.html
このエントリで例に出された正規表現も書き換える時期に来たね。
PHPspot、IDEA*IDEA、DAN KOGAIはそれぞれサンプル正規表現を出したらいいと思うよ。
生意気な物言いをする奴は突っつきたくなる性分なんだよね。
マジ切れした場合はその記事無視するんで、コメント残さないよ。
>それなら「バカ爺ぃ黙れ!」と上書きすれば話だろうに。
>普通に「ダンのばーか」でいいじゃんか?
それこそ便所の落書きだ。
非難するには、その理由を書かなければ相手に伝わらない。
まぁ、弾さんがここを見ているかどうかは微妙な所だが…
>>私はPHPを使っていない。
>とかいう2ch系の書き込みは余計に意味がわかんない。
これは
>ぺちぱー大発狂
という2ch系の書き込みに対して、2ch系の書き込みで返しただけだ。
こと、
>私はPHPを使っていない。
とかいう2ch系の書き込みは余計に意味がわかんない。普通に「ダンのばーか」でいいじゃんか?
言い返したいけど、うまい言葉が見つからなくて大発狂…って所か。
そしてあなたには残念だが、私はPHPを使っていない。
>向上心のないバカをたたいてるだけなのに、
>なんでこんなに燃え上がってるのだ?
本当にそうだったら、タイトルに「PHP」の文字出す必要ないよね?
>「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
>「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
>「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
大事なので3回書いてみた、つまりはそういう事だ。
※タイトルに書かなかったら、そういう言い訳も出来たのにね…
そもそも人の間違いを「それ見たことか」と罵倒してるだけなら誰だって出来る。
それってでもギーグが一番嫌う「口だけ」なのと何が変わるのだろうか?
本当に出来る人は黙ってPHPのコードを差し出す。
■エンジニアの説得力はコードじゃないの?
http://www.asks.jp/users/hiro/50416.html
こういう言語批判の裏の"本当の意図"は、
他の言語を貶めて"自分の好きな言語のシェアが伸びるように"情報操作したいだけなんだよね。
でもね…この方法って全くの逆効果。
自分からPerlの評判落としてる事に気が付かないんだろうか?
この記事見た所で「こんな偉そうな口きく生意気な奴らが使ってる言語なんて使わねぇよ!」って思うだけだよ?
※ちなみにRubyの作者もビッグマウスで同じ過ちを犯してる
あと、助言を。
最近の若者は、生意気な口きく奴には付いていかないよ?
汚らしいblogですね。
ユーザビリティ考えられない馬鹿はblogを書くなよww
固定概念というかなんというか。残念な記事ですね。
まるで若い2ちゃんねらのような発言です。
ここのコメントの一部にはまともな意見もありますが
その全てもアインシュタインではなく素人の意見として
みているんでしょうか。
ほんとうに残念です。
var res = 弾.phpspot("その正規表現には無駄な (?: ~ ) が2つあるけど何故?");
alert(res); // "スルー"
http://labs.cybozu.co.jp/blog/akky/archives/2007/10/phpspot-bad-regex.html
それかアルファブロガー様だから必死になって釣り記事作ってんじゃね
の指摘が予想通りスルーされてしまった件。
人の指摘はするのに自分が指摘されたら修正すらしないんすかー?
弾さんも叩きやすい相手ばかり叩いてないで、もっと大きい根本を叩けばいいのに。そういうことができる立場の人でしょうし。
なんなら、弾さんが新しくて間違えにくくて完璧な「メアドの仕様」および「それにマッチする正規表現」を提示されてはいかがでしょうか?
なんの冗談かと
隣のクラスの奴1人が嫌いになったら、そのクラス全体を嫌いになるという小学生レベルだと思うよ。
正規表現1パターンでメールアドレスヒットさせるわけ?
それ以外は認めないわけ?意味がわからねぇ。
携帯メールはつかわせないで、PCメールだけ受け付けるとか、いろいろ条件あるじゃん、実際の製品って。
都度動けばいいんじゃないの?
何を統一しようとしているの?
人間が作った物を人間がつかうんでしょ?
PHP使いでもすごい奴いっぱいいると思うし、そこらへんを理解しようともしないで、脳内で自己完結した自己満足と他者否定で浮かれあがっている、ただのあたまでっかちだと思った。
あのさ、俺はRubyが大嫌いだ。だけど、必要であればRuby使うよ。Javaだって大嫌いだ。だけど、Javaで書くのが適していると思ったら、Javaつかうんでないの? PHPとかPerlとかさ、どうでもいいじゃん。出来た製品がどう使われるかってところが大事なわけで。それがモノを作ることだと思うけどな。
“開発者のための開発”をしてるひとって、こういうこと言う人多い気がする。
逆に、「PHPキモ!」とか、感情的な意見を言ってくれたほうが、わかりやすいし納得いくけどな。
http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000119.html#wp521182
> x (extended) フラグ
>
> 正規表現は解読が困難になる場合があります。特に、メタ文字やメタシーケンスを多用した正規表現は難解になる場合があります。たとえば、次のようになります。
>
> /<p(>|(\s*[^>]*>)).*?<\/p>/gi
\s+ じゃないと\sを付ける意味が無い。
/s フラグを付けてないから . が改行文字にマッチしない。
/i を付けてあるから <p>~</P> にもマッチしてしまう。
「ヘルプ製作者はもう正規表現をヘルプに書くな」と言わせないでくれ
ネット上に溢れる情報の真贋なんて、結局は自分自身で確かめる他ないんですよ。
有名な検索エンジンの上位に来ようが、それは変わらない。
Wikipediaの情報は100%確かなものですか?
違うでしょう?
今回の記事は正規表現の間違いに憤ってるように見えますけど、結局のところ、「Web上に間違った情報を流すな」と大声で喚いてるだけだって気付いてますか?
規制や自治がお好みなら、回線を切断したスタンドアロンな環境で好きなだけやってて下さい。
名前付きグループの使用
http://livedocs.adobe.com/flash/9.0_jp/main/00000118.html#wp520966
> /(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/;
ヘルプのサンプルコードってどうしてこういう
無駄に分かりにくいものを用意してくるの?
(\w|[_.\-]) って [\w.\-] だよね?
弾さん、どうしてこういう分かりにくくて使いにくい
サンプルが氾濫するの?
あれ、名前付きグループで捕獲したものを $<名前> 等で取り出す手段が見当たらない。$1は出来て$<名前>は無理?
なんじゃそりゃ。
正規表現テスター (actionscript3.0)
http://1st.geocities.jp/neeetest/as3_regexp.html
これじゃプロとして守備範囲に入ってる人が
アマチュアを無闇に叩く野球の野村的構図じゃないですか?
スリーボールでしょうがないからストライク投げてみましたような
記事。
どうせならフォークボール(PGP)な問題提起をみたいです。
メールアドレスチェックはそこまで厳密にせんでいいだろw
熱くなりすぎw
バカ?
でもさすがにphperがどうのこうのってのはうざい。
phpつかいでもまともな人は沢山いるでしょ?
(greeの藤本さんとか)
phperが正規表現云々ってんじゃなくて
そのエントリーを書いた人のもんだいじゃねーの?
> ああ、まただよ...
2007年10月17日
phpspotの人は正規表現について語らないほうがいいのでは
http://labs.cybozu.co.jp/blog/akky/archives/2007/10/phpspot-bad-regex.html
> と言わせないでくれ
という持ちも分からなくはないです。
さすがに同じこと繰り返しているので、成長してほしいという思いなんでしょうね。
なんか役に立つアプリ書いてみろよ。
どアホ共が。
■azenrouytM氏作成 正規表現作成・テスト用ツール
Jane用ツール ReplaceStrTool ( バージョン2.8 : 2008/11/12 )
http://1st.geocities.jp/neeetest/
>ちなみに、これをまとめると、
..の下にある正規表現をクリップボードにコピーしてから
このツールの「貼り付け」ボタンを押してみて下さい。
(注
このツールは鬼車、またはWSH用の正規表現を書くためのツールです。
>ちなみに、これをまとめると、
その正規表現には無駄な (?: ~ ) が2つあるけど何故?
>[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]
\wや\dを何故使わないのだろう? /i も使えるかな?
>\^
PHPでは文字クラス内の ^ をエスケープするものなの?
>[\x21-\x5a\x5e-\x7e]
何故わざわざ16進表現文字で書いているのだろう?
(余談)
テキトーなことを書いているサイトが検索上位に来ると
苛立つ気持ち、良く分かります。自分もそうですから。
しかしプロ野球選手が小学生の野球少年に向かって怒鳴り
散らすようなことをしてはいけません。
あなたが (?: ~ ) の階層を管理出来ていないことに対して
私が
”「カッコの階層の管理も出来ない人にはブログを書くな」
と言わせないでくれ”
と言ったとして何かが良い方向に向かうでしょうか?
いいえ、
ケフィアです。
># http://jp2.php.net/manual/ja/function.ereg.php
ほんとに書いてるのかなぁ。
普通に使ってる人ならeregなんかよりpreg出すけどね
# しかもサンプルの正規表現はデリミタ付いてるし。
こんなんだから「PHP使ってるやつはダメダメだー」なんて言われるんじゃないかなぁ
>>774
モジュールの正当性を鵜呑みにするのもどうかと思うよ。
というか、正しいものが分からないのに、そのモジュールが正しいとかなんて分かるわけがないんだが。
>バカは実装の中身なんか知る必要はない
むしろプログラムを書くなが正しいかと。
CPANなんてまだまだ全然ろくなモジュールが登録されてなくて
まともなアプリ作るにはクラスライブラリ自作が必須だった時代の話。
ちなみに当時の Rubyの普及率は・・・ほぼ誤差の範囲(w
Pythonは、なぜかLinuxインストーラのお陰で地味に普及してたな(w
おかげで正しいメールアドレスを「不正なアドレスです」とか弾く一方で正しくないメールアドレスが通るような糞サイトが量産されているわけだ。(+を使えないサイトが多いからGmailやpostfixのサブアドレスを活用できなくて非常に困る)
これは正規表現云々の問題ではない。粗探しや誹謗としか捉えられない訂正や批判は実効性がない。どう考えても、正しいモジュールを探してやってそれを使うようにサジェストすべきだろ。バカは実装の中身なんか知る必要はない。「こういうのがあるから使えば間違いない」がいちばんいいんだよ。
× スキャナ
◎ スキャナとパーサ
2ch が出来るずっと前、ぁゃιぃワールド常連の某氏がそんなような事を言っていた覚えがある。もちろんそん時の答も、RFCに沿ってPerlでスキャナ構成しておしまい、にしたけどw
なぜかPHPはよく叩かれる言語ですよね。
何か作るとき楽に書けていい言語なんですけどね。
楽すぎてあまり考えない新米さんが多すぎるのも良くないんですかね。
きちんと使うといい言語ですよね、皆さん?!
というだけの話で、何故こんなに大騒ぎするのか理解に苦しむ。
というか、なんでも一つの正規表現で済まそうとする人は
そもそも 関数を作って記述を局所化しモジュール化するスキルが足りないだけでしょ。
特定の国の人の犯罪率が高いと、そいつら全部入国すんなって言うチャネラの方ですか?
伝え方は伝える内容ぐらい大事なんじゃないでしょうか。
正しく参照されるようなテキストを作ったほうがいいよね。
悪貨が良貨を駆逐する前に、良貨を作ってないんだもの。
内容は勉強になっただけにもったいない感じがする。
あと、最初は正規表現の技術的問題を指摘するのかと思ったら
実質的にはメルアドの仕様に関する知識なのは多少肩透かしを食らった。
弾さん、まだまだ「旬」のようです。
勝間さんと一緒に、時勢にのって
ガッポリ稼いでください。
# http://jp2.php.net/manual/ja/function.ereg.php
そもそも参照元の記事に「OK っぽい」とかある時点で明確な意図を持って検証を行ってないのは明らかなわけで、そういうのを文脈や、書いてるコードのレベルを読みと[られ]ずコピペして腐ったコードが量産されてくって構造はマトモにプログラミングを生業としてやってる立場から見ると文句のひとつも言いたくなる。
ネタがなくなったらどうでもいいPHP叩きを書けば盛況になっていいですね
世の中に山ほどあるゴミPerlスクリプトはなんで叩かないんですか?
アルファブロガー?ただのプログラマ崩れのゴミじゃないですか
プログラマとして「どこまで気にしているか」が、とても参考になります。
素晴らしい事だと思います。勉強になります。どうもありがとうございます。
余談ですが、
このタイトルをもじった、トラックバックのサイトがある為に、
このタイトルがさらに生きていますね。
皮肉ですが、「打ち合わせしていたのではないか?」と思うような、ユーモアがあります。
後、この記事は、悪い事はしていないはずですが、実店舗の場合だと、
営業妨害、名誉毀損って言われてしまうかも知れませんね(笑
このタイトルはもったいない。
プログラマーなら少なくとも、批判されるコードがあったら、批判するの当たり前だと思うけど・・ そうじゃないらしいw
としてる通り、そこじゃ厳密さは求めてない。実際、その正規表現で多くのメアドはヒットする。100%ヒットしないと満足しないですか?あぁそうですか。じゃあその際には"厳密に"と書いておくべきですね。
それにその引用元ではメアド以外にも多くの例題が挙げられてますが、それらについて揚げ足取りはなしですか?このメアドの件だけで全否定ですか?
まぁPHPは簡単に書ける分、未熟な技術者による情報の氾濫はありますが、未熟者は自信のない内容は書くなってことか。管理人さんはものすごーい自分のコードに自信をお持ちなんですね。絶対に間違った内容は発信しないわけですね。
間違ったら修正すればいいって?じゃあPHPSPOTも修正すればいいわけですね?それって、そもそもPHPとは関係なく書き手の姿勢の問題ですよね?
P.S.
>悪名高きda.me..@docomo.ne.jpを引っ掛ける
引っかけないなら、ドコモユーザーは来るなってことだよね?
>一方で、dankogai+regexp@gmail.comを弾いてしまう。
弾くのは問題かもだけど、ウェブサービス屋としては、1メアド1アカウントとするためには、これは弾きたい。(gmailの場合にかぎるけど)gmail以外で + が入ってるメアドって .@ なメアド並に希じゃない?
ただ、これはPHPerがというよりはPHP自体と、その先駆者(?)達の罪の方が大きいようにも感じます。よいコードを読むことが出来ない環境にいたら、仕方ないとも言えなくはないかと。
貢献しているだけに間違った時の悪影響も大きいかと思います。
読み手の自己責任だと言ってblogの書き手が自分の記事に責任を持たなくなったら、ウェブはどんどん間違った情報が増えていくでしょう。
PHPerへの配慮が欠けているのには同意。
その気持ちもわからなくはないんだけど、感情的になりすぎ。
自分の土俵だけでやるんじゃなくって。
何回読み直したんですか?
このエントリー読む限り、小飼って人も大した事無いね。
私は何年も前にphpspotなどを見て勉強をして今の生活を手に入れています。
phpspotの管理人さんがもし間違った正規表現を書かれていたとしても、
phpspotを見て、PHPを覚えた人、成長した人はきっとたくさんいます。
目には見えませんが、その貢献度は多大なるものだと思います。
昔、自分がお世話になったサイトが悪く書かれてしまうのは非常に悲しいです。
(実際にはまったく動かないわけではないからあれは間違いではないと私は思ってます。というか、仕事でプログラム書くならコピペしても自己責任ですよ。プロなんですから。)
私はIDEA*IDEAもphpspotも好きなサイトで、いつも有益な情報を発信してくれるサイトであると思っています。PHPが好き、嫌いよりも前に、ブラウザの先で見ている人のコトをもう少しお考えになって記事を書いて頂くといいかなっと思いました。
ですね。わかります。
正しい方向へ導きたいならそう書けばいいのでは?
例えば「詳細 正規表現」などという本の存在が気にならないひとはプログラミングを他者に説くには不向き、ということでは。
正規表現でメールアドレスをチェックするのは無駄な努力。
間違った情報の量の問題?
言語でくくるのは賛成できません。
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
もう一つプログラミングの世界だと、ソースコードの善し悪しで語るべきで、駄目だと言われてしかもそれが証明されてるなら、それは認めるべきだとおもうんだわ。 それを感情的にだとかで逃げていつまでたっても有害な情報を直さないで、それでよしとしてる。 「だからPHPって・・」って言われるのがわからないのかなーと
て書いてるのに・・・
話はよくわかりますが、だいぶ感情的では?と思いました。
PHPって敵?。
ホンマにPHPとPHPerが嫌いなんだなと参考になりました。
Thx, fixed.
Dan the Typo Generator
<code>From: <span style="background-color:#ffc">Anonymous <nobody@example.com></cpan></code>、
すなわち<code>mailbox</code>は
で </span> と思われるとこが </cpan> になってる
・・・とはいえ、世の中広まれば広まるほどこんなもんだと思います。