开发者

Regex to match all URLs except certain URLs

I need to match all valid URLs except:

http://www.w3.org

http://w3.org/foo

http://www.tempuri.org/foo

Generally, all URLs except certain domains.

Here is what I have so far:

https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?  

will match URLs that are close enough to my needs (but in no way all valid URLs!) (thanks, http://snipplr.com/view/2371/regex-regular-expression-to-match-a-url/!)

https?://www\.(?!tempuri|w3)\S*

will match all URLs with www., but not in the tempuri or w3 domain.

开发者_开发百科

And I really want

https?://([-\w\.]+)(?!tempuri|w3)\S*

to work, but afaick, it seems to select all http:// strings.

Gah, I should just do this in something higher up the Chomsky hierarchy!


The following regular expression:

https?://(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)\S*

only matches the first four lines from the following excerpt:

https://ok1.url.com
http://ok2.url.com
https://not.ok.tempuri.com
http://not-ok.either.w3.com

http://no1.w3.org
http://no2.w3.org
http://tempuri.bla.com
http://no4.tempuri.bla
http://no3.tempuri.org
http://w3.org/foo
http://www.tempuri.org/foo

I know what you're thinking, and the answer is that in order to match the above list and only return the first two lines you'd have to use the following regular expression:

https?://(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)\S*

which, in truth, is nothing more than a slight modification of the first regular expression, where the

(?!w3|tempuri)([-\w]*\.)

part appears twice in a row.

The reason why your regular expression wasn't working was because when you include . inside the ()* then that means it can not only match this. and this.this. but also this.this.th - in other words, it doesn't necessarily end in a dot, so it will force it to end wherever it has to so that the expression matches. Try it out in a regular expression tester and you'll see what I mean.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜