今回で最後の正規表現の記事になります。今回は、Emailアドレス、URI(URL)の正規表現と実は使ってはいけないメタ文字を書いていきたいと思います。8月14日記事

目次





メールアドレスの正規表現

これはすごい議論を呼びそうなので、ちょっと理由を説明してから正規表現を書いていきたいと思います。 まず、実際には次のような状況が起こっています。

RFCとプロバイダ(携帯電話会社含む)の違い
RFC(インターネットに関する技術の標準を定める団体)が使ってもいいよ!と提唱しているメールアドレスと実際のプロバイダや携帯電話会社で利用できるメールアドレスは違ということです。標準化されているものはたくさん使える記号が多いのに対して、携帯電話会社やプロバイダは制限されています。@より前で、!や$や%などの特殊記号もRFCでは実は使ってよいのです。ただ、利用している側からすると@以前は特殊記号を使うと、制限されるプロバイダがあるからあまりそういうメールアドレスにしたくないのが実情で半角英数字やあっても-(ハイフン)や.(ドット)や_(アンダーバー)ぐらいだと思います。(かなり前だが、_をつかってメールアドレス登録したらエラーのサイトがあった・・・)

当然、 ISPや携帯電話会社は使ってもいい特殊文字の独自ルールの正規表現 が必要なのに対して、 ASPの中でメールアドレスをログイン名とするようなサービスでは、どのメールアドレスでも対応できるような正規表現 が必要になってくると思います。ということで、 メールアドレスの正規表現はこれだ!というのは一概には言えないのです。

RFC的にはこの正規表現

引用ではありますが、このようになっています。

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

http://blog.livedoor.jp/dankogai/archives/51189905.html

一般的なやつ

"/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/"



URL(URI)の正規表現

一般的なやつ

"/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/"

https?はhttpかhttpsは通すよという意味 これだと、http://localhost/とかは通るよね。そして、http:///www.google.co.jpも通しちゃうよね。

3つめのスラッシュを入れられた場合ぐらいは除外したい。

"/^(https?|ftp):[\/]{2}([-_.a-zA-Z0-9]+)([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/"

三番目にくるスラッシュの文字や他の記号を制限しています。スラッシュ全部を制限してしまうとwww.google.co.jp/index.htmlを制限しちゃうことになってしまうから・・

様々な試みの紹介

「RFC3986定義の厳密なHTTP URIの正規表現」をPHP用に最適化

実は使ってはいけないメタ文字

日本では有名なハッカー(クラッカーではないと思うけど)徳丸先生の記事では^と$は正規表現では使うべきではないとおっしゃっております。 衝撃..
このブログによれば、^は\A、$は\Zを使うべきであるとしています。 データ末尾に改行が含まれている場合を見逃してしまう らしいのです。ということは改行の時のみ注意すればよいのでしょうか?一行のみは^や$がよさそうです。

まとめ

正規表現勉強してると、あーこういう例外があるなぁや、これ通っちゃうなぁ等がでてくるのは当然だと思います。 そんな場合はフォローや指摘しあっていいものにしていきましょう。そういう心構えこそがインターネットとよく付き合う方法だと思います。これ通るよ!という方はコメントください

名前:
コメント:



以上

最終更新:2015年10月28日 13:50