在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  HTML/ 求一個驗證url合法性的正則,網上找了很多都有漏洞

求一個驗證url合法性的正則,網上找了很多都有漏洞

求一個驗證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

上面的都有問題,求高手給一個能用的?

回答
編輯回答
疚幼

https://www.npmjs.com/package...
:看一下這個,我覺得有想要解決的問題先去npmjs上去搜,可能會給你想要的結果。

2017年10月28日 11:12
編輯回答
呆萌傻

可以負責任的告訴你,找不到符合你條件的正則。
就比如 www.sina你說它是合法還是不合法呢?你想說它不合法,因為域名后綴不對。 域名后綴數量奇多,如果想把所有合法域名后綴都加上,這個正則會超級長! cn,com, io, org,us,ca,me,ink, xyz,in,pro,studio,news, app...各種后綴層出不窮,全部窮舉一遍,做不到,每天都在更新。 除非你只關心指定的幾種后綴,才能判斷www.sina是不是合法。 到底后綴有多少,看看這個網站就知道了

2017年11月15日 09:04
編輯回答
款爺

很遺憾的告訴你,正則表達式檢測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...

不過你要是伸手黨,就當我沒說。

2017年2月17日 20:31
編輯回答
慢半拍

看了一下正則,有個明顯的錯誤:

+ '([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包,在瀏覽器中就不能使用了。

2018年1月11日 14:25
編輯回答
艷骨
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中必須帶有協議才能通過

2018年7月14日 19:35