タイトルだけでは想像しにくいと思うので、具体例を挙げます。「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に厳密に対応できているかどうかまでは保証できませんので、ご注意ください。