Ser*_*kov 2 php validation url
我们可以使用filter_vars()with FILTER_VALIDATE_URL和flags:
FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
Run Code Online (Sandbox Code Playgroud)
FILTER_VALIDATE_URL根据RFC 2396将值验证为URL,并在内部使用parse_url()并需要方案(协议)和主机部分。
如果我还想检查路径和查询零件,则可以这样使用filter_vars:
filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED);
Run Code Online (Sandbox Code Playgroud)
但是FILTER_FLAG_SCHEME_REQUIREDand FILTER_FLAG_HOST_REQUIRED标志的用途是什么?无论我们是否指定这些标志,似乎无论如何都将检查主机部件。
例如,如下过滤有效的相对URL:
filter_var('test1/2.html', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);
Run Code Online (Sandbox Code Playgroud)
返回false。
PHP 7.3.0
FILTER_FLAG_SCHEME_REQUIRED而FILTER_FLAG_HOST_REQUIRED现在已被弃用的PHP 7.3.0,因为他们使用FILTER_VALIDATE_URL反正。
你是对的。这两个标志默认情况下处于打开状态,尽管有官方文档中所述(请参见下文),也无法禁用它们。正如您在问题中所写,它们是无用的。我认为这是一个错误。有一个bug报告与此有关。
当心有效的URL可能未指定HTTP协议http://,因此可能需要进一步的验证才能确定URL使用预期的协议,例如ssh://或mailto:。
URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
absoluteURI = scheme ":" ( hier_part | opaque_part )
relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
hier_part = ( net_path | abs_path ) [ "?" query ]
opaque_part = uric_no_slash *uric
uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
"&" | "=" | "+" | "$" | ","
net_path = "//" authority [ abs_path ]
abs_path = "/" path_segments
rel_path = rel_segment [ abs_path ]
rel_segment = 1*( unreserved | escaped |
";" | "@" | "&" | "=" | "+" | "$" | "," )
scheme = alpha *( alpha | digit | "+" | "-" | "." )
authority = server | reg_name
reg_name = 1*( unreserved | escaped | "$" | "," |
";" | ":" | "@" | "&" | "=" | "+" )
server = [ [ userinfo "@" ] hostport ]
userinfo = *( unreserved | escaped |
";" | ":" | "&" | "=" | "+" | "$" | "," )
hostport = host [ ":" port ]
host = hostname | IPv4address
hostname = *( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
port = *digit
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
query = *uric
fragment = *uric
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
"$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
"(" | ")"
escaped = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
alphanum = alpha | digit
alpha = lowalpha | upalpha
lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
"j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
"s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
"J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
"S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
"8" | "9"
Run Code Online (Sandbox Code Playgroud)
如您所见,有效的URL可能没有方案部分或主机名部分(如果是相对的)。也许,FILTER_FLAG_SCHEME_REQUIRED并FILTER_FLAG_HOST_REQUIRED应有助于设计,以检查它们的存在。但这是不可能的。