読者です 読者をやめる 読者になる 読者になる

かすてらすねお。(hateblo)

見聞録的ななにか。

"http://"の欠けた日本語入りURLの正規表現

タイトルだけでは想像しにくいと思うので、具体例を挙げます。「hrio.edoblog.net/開発メモ/is05でデバッグするまでの奮闘記」は日本語が含まれているURLで、尚且つ"http://"が欠けています。このような形のURLはTwitterの自動短縮でよく見かけると思います。このURLに一致する正規表現を考えてみました。



/([\w*%#!()~\'-]+\.)+[\w*%#!()~\'-]+(\/[\w*%#!()~\'-.]+)*/u

長いですね。ちょっとずつ見ていきましょう。


[\w*%#!()~\'-]+\.


"[ ]"内に列挙された文字は、URLに使用可能な文字のうち、区切り文字や特定の意味や役割を持つ文字を除いた文字です。""の直後の"+"は「直前の文字が1個以上繰り返される」という意味で、1文字以上の文字列を表す事ができます。その後ろの"\."は、"."(ドット)を表現します。"\"は「通常文字として扱われない『メタ文字』を通常の文字として扱えるようにする」文字です。"hrio", "edoblog", "net"にあたる文字列はこれで取り出せます。"[...]+"を文字列と捉えると分かりやすいと思います。


([...]+\.)+[...]+


上で取り出せた文字列を"{str}"とすると、ドメイン部分は"{str}.{str}.{str}"のように、1個以上の"{str}."の後ろに1個の"{str}"が付くわけです。これを実現しています。


(\/[\w*%#!()~\'-.]+)*


ドメインの後ろにはファイルパスやリクエストを表す0個以上の"/{str}"が付いています。"*"は「直前の文字が0個以上繰り返される」という意味で、これを実現しています。なお、ドメインの時とは違って""の中に"."が含まれています。これは、"index.html"といった拡張子に含まれる"."に対応するためです。


/.../u


正規表現は"/"で囲う決まりになっています。また、日本語のようなマルチバイト文字に対応するためには、後ろの"/"の後ろに"u"を付ければよいです。これで日本語を含むURLに対応することが可能です。


正規表現を手っ取り早く検証するならこちらが便利です。


以上で説明を終わりますが、すべてのURLに厳密に対応できているかどうかまでは保証できませんので、ご注意ください。