2009-01-12 82 views
1

驗證RFC 3986的URI非常簡單。你可以使用一個regular expression like國際資源標識符驗證

/^              # Start at the beginning of the text 
([a-z][a-z0-9\*\-\.]*):\/\/       # The scheme 
(?:             # Userinfo (optional)            
    (?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)* 
    (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})[email protected] 
)? 
(?:             # The domain 
    (?:[a-z0-9\-\.]|%[0-9a-f]{2})+      # Domain name or IPv4 
    |(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\])  # or IPv6 
) 
(?::[0-9]+)?           # Server port number (optional) 
(?:[\/|\?] 
    (?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2}) # The path (optional) 
*)? 
$/xi 

但是,這並不像那些在國際域名中發現的國際字符工作。例如,http://例え.テスト/メインページ

使用類似

filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED); 

這些不工作,要麼。這個問題與所使用的字符有關。

有沒有一種驗證PHP中的URI的好方法?

回答

1

使用preg_match \ pL將匹配任何unicode字母。所以用\ pL替換a-z。與\ pN 0-9。有關更多信息,請參閱Regular Expression Details