2010-07-08 155 views
0

可能重複:
Regular expression for browser Url正則表達式的URL的正則表達式

這是正則表達式完美的任何網址?

preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i', 
$url, $regp); 
+3

'[www]'不是你想象的那樣。閱讀[字符類](http://www.regular-expressions.info/charclass.html) – Amarghosh 2010-07-08 10:43:18

+1

你自己寫了嗎?你的意思是什麼網址? – Gumbo 2010-07-08 10:43:41

+1

'博物館'是一個有效的頂級域名,如'com','net'等 – Amarghosh 2010-07-08 10:44:35

回答

0

[www]+應改變(www)?

(\.|dot){1,} - 一個多? mayby你想要做([a-zA-Z0-9_\.-]+(\.|dot)){1,}

0

A URL也有一個協議,如http,你錯過了。正如已經提到的,您還缺少很多頂級域名。

類似於轉義空間(%20)的東西也不會被識別。

端口號也可以出現在URL時(如:80)

+0

URL也可以是相對的。即使是空字符串也是一個有效的URL。 – Gumbo 2010-07-08 10:50:41

+0

根據您想要的迂腐程度,相對* URI *不會被歸類爲* URL *。 – bobince 2010-07-08 10:58:58

+0

@bobince:這一切都取決於您的術語來自哪些規範:RFC 1808規定* URL *是資源定位符中最常用的術語,而RFC 3986使用術語* URI-reference *。 – Gumbo 2010-07-08 11:10:02

0

不,你不能創建一個正則表達式,將解析任何URI(或URL或URN) - 在唯一方法來解析他們正確地閱讀它們的規範RFC-3986

1

不,實際上它根本不匹配URL。它試圖檢測用文本編寫的主機名,如www.example.com

其做法是嘗試檢測一些常見的已知的頂級域名,但:

[com|net|org|info\.]+ 

實際上是一個字符組,允許從列表|.comnetrgif任何字符序列。大概這是意味着:

((com|net|org|info)\.)+ 

[www]同樣是錯誤的,加上dot企業沒有真正使任何意義。

但這通常是一個非常糟糕的主意。有方式更常用的頂級域名,而不僅僅是那些和兩個字母的CCTLD。還有很多/大多數CCTLD沒有com/net/org/info的二級域名。這個表達式將無法匹配這些表達式,並且會匹配一些其他不應該成爲主機名的東西。

事實上,檢測主機名的任務基本上是不可能的,因爲單個單詞可以是主機名,任何點分隔的單詞序列都可以。 (並且自引入國際化域名以來,幾乎任何東西都可以成爲主機名,例如例え.テスト。)

+0

IP地址也是一個有效的主機:'http:// 127.0.0.1 /'是一個有效的絕對URL。 – Gumbo 2010-07-08 10:59:42

+0

...更不用說IPv6地址!嘗試在文本中匹配主機名/ IP地址永遠不會可靠。 – bobince 2010-07-08 11:02:13

1

'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是一個非常有用的工具,如果我正在開發正則表達式,我不擅長。

+0

我可以和.com網址繞過這個正則表達式嗎? – ITGuru 2010-07-10 07:21:57

+0

可以通過這個REGEX preg_match_all( '/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot ){1,} [com | net | org | info \。] +((\。| dot){0,} [a-zA-Z]){0,} +/i', $ url,$ regp); – ITGuru 2010-07-10 07:22:37