【发布时间】:2011-10-23 14:57:09
【问题描述】:
【问题讨论】:
-
有效,因为它正确解析?或者如果它只是一个跟随 URL 的 RFP 的字符串?
【问题讨论】:
这取决于您对有效的定义。语义有效,域名解析等。
快速的方法是使用 preg_match 对照良好的正则表达式测试 url,以验证其格式是否正确。这个线程上似乎有一些很好的例子PHP validation/regex for URL
【讨论】:
是的,有!使用filter_var:
if (filter_var($url, FILTER_VALIDATE_URL) !== false) ...
FILTER_VALIDATE_URL 根据RFC 2396 验证 URL。
【讨论】:
echo filter_var('http://example.com/"><script>alert(document.cookie)</script>', FILTER_VALIDATE_URL);请注意5.4中的filter_var();
(filter_var($url, FILTER_VALIDATE_URL) !== false)而不是(filter_var($url, FILTER_VALIDATE_URL))?
如果我们查看RFC 3986,我们可以找到 URL 的定义。
如果我们看一下附录 B,这里有使用正则表达式解析 URL 的指南:
附录 B. 使用正则表达式解析 URI 引用
由于“第一场比赛获胜”算法与“贪婪”算法相同
POSIX正则表达式使用的消歧方法,它是
使用正则表达式进行解析是很自然且司空见惯的
URI 引用的潜在五个组成部分。下面一行是分解a的正则表达式
对其组件的格式良好的 URI 引用。^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9上面第二行的数字只是为了帮助 可读性;它们指示每个参考点 子表达式(即每个成对的括号)。我们指的是 与子表达式匹配的值为 $。例如,匹配 上面的表达式为
http://www.ics.uci.edu/pub/ietf/uri/#Related导致以下子表达式匹配:
$1 = http: $2 = http $3 = //www.ics.uci.edu $4 = www.ics.uci.edu $5 = /pub/ietf/uri/ $6 = <undefined> $7 = <undefined> $8 = #Related $9 = Related其中表示组件不存在,如 上面示例中的查询组件就是这种情况。 因此,我们可以将五个分量的值确定为
scheme = $2 authority = $4 path = $5 query = $7 fragment = $9反过来,我们可以重新创建一个 URI 引用 使用第 5.3 节的算法从其组件中提取。
您可以使用此正则表达式手动解析 URL 或使用 PHP 4 和 5 中内置的 parse_url function avalable
【讨论】: