Sunday, May 13, 2007

Is it a URL?

Oh how can one not love regular expressions. Anything that can use the following string to actually successfully validate a URL (an Open ID URL in my case) must be good. Reference.


(?:http://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;:@&=])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;:@&=])*))?)?)(?:ftp://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*))*)(?:;type=[AIDaid])?)?)(?:news:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;/?:&=])+@(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3})))(?:[a-zA-Z](?:[a-zA-Z\d][_.+-])*)\*))(?:nntp://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:[a-zA-Z](?:[a-zA-Z\d][_.+-])*)(?:/(?:\d+))?)(?:telnet://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))/?)(?:gopher://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=](?:%[a-fA-F\d]{2}))(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=](?:%[a-fA-F\d]{2}))*)(?:%09(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;:@&=])*)(?:%09(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=](?:%[a-fA-F\d]{2}))*))?)?)?)?)(?:wais://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*)(?:(?:/(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*)/(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*))\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;:@&=])*))?)(?:mailto:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=](?:%[a-fA-F\d]{2}))+))(?:file://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))localhost)?/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*))*))(?:prospero://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&=])*))*)(?:(?:;(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&])*)=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[?:@&])*)))*)(?:ldap://(?:(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))?/(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d]%(?:3\d[46][a-fA-F\d][57][Aa\d]))(?:%20))+(?:OIDoid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*))(?:(?:(?:%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(?:(?:(?:[a-zA-Z\d]%(?:3\d[46][a-fA-F\d][57][Aa\d]))(?:%20))+(?:OIDoid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*)))*)(?:(?:(?:(?:%0[Aa])?(?:%20)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))(?:(?:(?:(?:(?:(?:[a-zA-Z\d]%(?:3\d[46][a-fA-F\d][57][Aa\d]))(?:%20))+(?:OIDoid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*))(?:(?:(?:%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(?:(?:(?:[a-zA-Z\d]%(?:3\d[46][a-fA-F\d][57][Aa\d]))(?:%20))+(?:OIDoid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))*)))*))*(?:(?:(?:%0[Aa])?(?:%20)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))?)(?:\?(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+)(?:,(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+))*)?)(?:\?(?:baseonesub)(?:\?(?:((?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=](?:%[a-fA-F\d]{2}))+)))?)?)?)(?:(?:z39\.50[rs])://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+)(?:\+(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+))*(?:\?(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+))?)?(?:;esn=(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+))?(?:;rs=(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+)(?:\+(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))+))*)?))(?:cid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?:@&=])*))(?:mid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[;?:@&=])*))?)(?:vemmi://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[/?:@&=])*)(?:(?:;(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[/?:@&])*)=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[/?:@&])*))*))?)(?:imap://(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~])+)(?:(?:;[Aa][Uu][Tt][Hh]=(?:\*(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~])+))))?)(?:(?:;[Aa][Uu][Tt][Hh]=(?:\*(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~])+)))(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~])+))?))@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))/(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~:@/])+)?;[Tt][Yy][Pp][Ee]=(?:[Ll](?:[Ii][Ss][Tt][Ss][Uu][Bb])))(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~:@/])+)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~:@/])+))?(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1-9]\d*)))?)(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~:@/])+)(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1-9]\d*)))?(?:/;[Uu][Ii][Dd]=(?:[1-9]\d*))(?:(?:/;[Ss][Ee][Cc][Tt][Ii][Oo][Nn]=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),](?:%[a-fA-F\d]{2}))[&=~:@/])+)))?)))?)(?:nfs:(?:(?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]-)*[a-zA-Z\d])?))(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:(?:/(?:(?:(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*))*)?)))?)(?:/(?:(?:(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*))*)?))(?:(?:(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),])(?:%[a-fA-F\d]{2})[:@&=+])*))*)?)))

No comments: