2011-08-20 23 views
2

我一直在閱讀上的堆棧溢出各個崗位,試圖找到驗證PHP中的URL的理想方式。我的研究提出了三種可能的解決方案,但是,它們都不是理想的。更好的辦法來驗證URL在PHP

提到的三種方法是正則表達式,filter_var ($url, FILTER_VALIDATE_URL)parse_url()。第一種方法的問題已經衆所周知,並且我可以找到最全面的驗證正則表達式。內置到PHP過濾擴展中的filter_var函數似乎有錯誤,例如將http:// ...這樣的url視爲有效。 parse_url方法使用的是從未用於URL驗證的函數,因此不能依賴於此任務。

是否有關於PHP網址驗證,我可能已經錯過了任何其他的選擇嗎?

+0

搶的類,它它已經。用於isntance的Zend_Validate_Hostname。 – Layke

+4

當你說URL驗證時,你的意思是解析爲頁面/響應?還是一個正確組建的?您是否只希望驗證完整的網址或相對網址(例如'google.com')? – Alex

回答

2

你怎麼樣結合filter_var(這基本上是一個跨越頁面的正則表達式),對於你認爲沒有被覆蓋的情況,還需要額外的正則表達式檢查嗎?

+1

我剛剛被重新審視這個問題,並正在尋找FILTER_VALIDATE_URL是完全破碎。它無法驗證包含IPV6地址的網址。我想我需要一種方法,完全避免filter_var。 – GordonM

+0

或者您可能希望在php.net上填寫功能請求,以便添加IPv6支持。或兩者。 – Mchl

+1

似乎有人想到了。 https://bugs.php.net/bug.php?id=54629已開放8個月。在這個和FILTER_VALIDATE_EMAIL碰到的問題之間,我得到的印象是,最好避免使用內建的過濾器。 – GordonM

1

我ussually使用parse_url()用於檢查/驗證URL(在大多數情況下,我需要確定URL是否已經是一個有效的URL或相對URL)

if (parse_url($url, PHP_URL_SCHEME) != '') 
{ 
    // Url is absolute 
} 
else 
{ 
    // Url is not an absolute url, and therefore, need more validation... 
}