求一個驗證url合法性的正則,網上找了很多都有漏洞,如下面這個:
function IsURL(str_url){
var strRegex = '^((https|http|ftp|rtsp|mms)?://)'
+'?(([0-9a-z_!~*().&=+$%-]+: )?[0-9a-z_!~*().&=+$%-]+@)?' //ftp的user@
+ '(([0-9]{1,3}.){3}[0-9]{1,3}' // IP形式的URL- 199.194.52.184
+ '|' // 允許IP和DOMAIN(域名)
+ '([0-9a-z_!~*()-]+.)*' // 域名- www.
+ '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].' // 二級域名
+ '[a-z]{2,6})' // first level domain- .com or .museum
+ '(:[0-9]{1,4})?' // 端口- :80
+ '((/?)|' // a slash isn't required if there is no file name
+ '(/[0-9a-z_!~*().;?:@&=+$,%#-]+)+/?)$';
var re=new RegExp(strRegex);
if (re.test(str_url)){
return (true);
}else{
return (false);
}
}
IsURL("sfas") //居然返回true
IsURL("http://www.baidu.com") //這個也是true
再看這個:
var regex =/^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?$/i;
regex.test('http://www.sina/') //true
上面的都有問題,求高手給一個能用的?
可以負責任的告訴你,找不到符合你條件的正則。
就比如 www.sina你說它是合法還是不合法呢?你想說它不合法,因為域名后綴不對。 域名后綴數量奇多,如果想把所有合法域名后綴都加上,這個正則會超級長! cn,com, io, org,us,ca,me,ink, xyz,in,pro,studio,news, app...各種后綴層出不窮,全部窮舉一遍,做不到,每天都在更新。 除非你只關心指定的幾種后綴,才能判斷www.sina是不是合法。 到底后綴有多少,看看這個網站就知道了
很遺憾的告訴你,正則表達式檢測url合法性正則檢測遠比你想象中的要復雜的多。我的建議是:把url限制在一個范圍里面,之后再用get請求根據返回的http狀態(tài)碼來檢測這個url是否存在來檢測是否能達到你的要求。
我給你解釋一下為什么給你這樣的建議:
url組成部分什么的我就不說了。想要檢測url你要檢測:
1.協議(協議不能決定url是否合法,除非強制url帶有協議)、但是協議的數量很少,10個手指數的過來,很好使用正則做判斷。
2.域名:想要檢測域名是否合法,檢測的部分分為域名前綴、域名名稱和后綴(擴展名)。因為現在的域名名稱中可以包含中文、日文、阿拉伯文(可能還有我不知道的),后綴也是一樣。
例如【にっぽんこく.com】這樣一個域名雖然目前不能訪問,但是是合法的。例如【xxxx.中國】也是合法的。就目前所知道的域名后綴數量有882個之多。里面包含了我說的域名所包含的語言。
3.端口、用戶名、密碼。事實上一個帶有用戶名、密碼和端口號的url也可能是合法的。例如www.baidu.com:80,或者http://username:password@www.example.com/path/index.html
這種形式的url也是合法的。你現在看到的網站網址沒有用戶名和密碼是因為瀏覽器以匿名用戶向服務器發(fā)送請求,并且服務器沒有任何限制。但是帶有用戶名和密碼的url就是合法的。
3.path部分。url的資源路徑,以及可能攜帶查詢參數,或者帶有#標記的fragment。例如:www.baidu.com:80/path/233.html?query=xxxx&query2=xxxx#some
這種url也是合法的。
4.參數查詢中的標點。www.example.com?qyuer=lily's blog 這個是合法的,不過會對url進行編碼,空格會被轉義成帶有%的十六進制數字表示。http://www.example.com/?qyuer...
這兩個url是一樣的。
所以,你想在網上找一個url合法性檢測的正則表達式是不可能做到十分全面的。
如果你有興趣可以按照上面的思路自己實現一個。
判斷域名的長度,一個域名最長的長度為:255個字節(jié)(包括標點符號)。域名名稱最長63字節(jié),比如example.com example部分最長63字節(jié)。域名后綴最長13個字節(jié)(目前)。如果你還想判斷語言的話可以對不通語言的域名后綴長度做判斷,例如域名后綴的判斷:([a-z]{2,13}|[x{4e00}-x{9fa5}]{2,3})。
url中的用戶名和密碼可以限定在一定長度內。然后協議判斷:有協議的是否在限定的范圍內,如果沒有可以默認為http協議。
一般判斷url合法只是為了防止惡意輸入,如果你想知道該url是否可以正常訪問最好的方式還是發(fā)送get請求根據http狀態(tài)碼做判斷。爬蟲就是這么干的。不過可能會遇到國內服務器因為防火墻的緣故國外的url訪問不了的情況,所以建議使用美國服務器或者香港的對url進行檢測。
關于域名擴展數量你可以這里:https://www.key-systems.net/e...
不過你要是伸手黨,就當我沒說。
看了一下正則,有個明顯的錯誤:
+ '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].' // 二級域名
//應該是:
+ '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.' // 二級域名
這里應該是要有個點的,但正則中的點是.,而不是. 。
注意:. 匹配除換行符 n 之外的任何單字符。要匹配 . ,請使用 . 。
其它的就不多說了,合法的url基本上沒有什么限制,除了知道至少是這樣:
基本上是任意字符+點+基本上是任意字符+隨便你怎么寫,可能都是參數
比如樓主寫的就沒有考慮中文域名的情況。
另外,樓上 kumfo 結的 npm包用了 nodejs的url包,在瀏覽器中就不能使用了。
reg = /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)$/;
把上面函數里的正則這樣改一下是可以的,url中必須帶有協議才能通過
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。