国际资源标识符验证

时间:2009-01-12 14:57:29

标签: php validation

验证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})+@
)?
(?:                                                    # 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 个答案:

答案 0 :(得分:1)

使用preg_match \ pL将匹配任何unicode字母。所以用\ pL替换a-z。并且0-9与\ pN。有关详细信息,请参阅Regular Expression Details