這是正則表達式完美的任何網址?
preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i',
$url, $regp);
這是正則表達式完美的任何網址?
preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i',
$url, $regp);
[www]+
應改變(www)?
(\.|dot){1,}
- 一個多? mayby你想要做([a-zA-Z0-9_\.-]+(\.|dot)){1,}
不,你不能創建一個正則表達式,將解析任何URI(或URL或URN) - 在唯一方法來解析他們正確地閱讀它們的規範RFC-3986
不要使用正則表達式。如果你不能抗拒,可以在這裏找到一個有效的: What is the best regular expression to check if a string is a valid URL? 但這個正則表達式是荒謬的。嘗試使用你的框架,如果你可以的話(例如Uri在.net中的類)。
不,實際上它根本不匹配URL。它試圖檢測用文本編寫的主機名,如www.example.com
。
其做法是嘗試檢測一些常見的已知的頂級域名,但:
[com|net|org|info\.]+
實際上是一個字符組,允許從列表|.comnetrgif
任何字符序列。大概這是意味着:
((com|net|org|info)\.)+
也[www]
同樣是錯誤的,加上dot
企業沒有真正使任何意義。
但這通常是一個非常糟糕的主意。有方式更常用的頂級域名,而不僅僅是那些和兩個字母的CCTLD。還有很多/大多數CCTLD沒有com/net/org/info的二級域名。這個表達式將無法匹配這些表達式,並且會匹配一些其他不應該成爲主機名的東西。
事實上,檢測主機名的任務基本上是不可能的,因爲單個單詞可以是主機名,任何點分隔的單詞序列都可以。 (並且自引入國際化域名以來,幾乎任何東西都可以成爲主機名,例如例え.テスト
。)
'any'url是一個強硬的調用。在OZ你有.com.au,在英國它是.co.uk每個國家都有自己的規則,他們可以改變。 .xxx剛剛獲得批准。非ASCII字符現在已被批准,但我懷疑你不需要這些字符。
我想知道你爲什麼要驗證那是緊的?許多正確的網址將被排除,並且不排除所有不正確的網址。 www.thisisnotavalidurl.com仍然會被接受。 A)使用鬆散檢查,僅用於([a-zA-Z0-9 _.-]。)* [a-zA-Z0-9 _.-](或somthing),就像一個完整性檢查 B)使用反向查找來檢查URL是否真的有效,如果你只想允許實際的真實URL。
哦,我發現這個:http://www.fileformat.info/tool/regex.htm是一個非常有用的工具,如果我正在開發正則表達式,我不擅長。
'[www]'不是你想象的那樣。閱讀[字符類](http://www.regular-expressions.info/charclass.html) – Amarghosh 2010-07-08 10:43:18
你自己寫了嗎?你的意思是什麼網址? – Gumbo 2010-07-08 10:43:41
'博物館'是一個有效的頂級域名,如'com','net'等 – Amarghosh 2010-07-08 10:44:35