验证RFC3986的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})+@
)?
(?: # 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的好方法?
发布于 2009-01-13 10:40:56
使用preg_match \pL将匹配任何unicode字母。因此,将a-z替换为\pL。pN为0-9。有关详细信息,请参阅Regular Expression Details。
https://stackoverflow.com/questions/435657
复制相似问题