【发布时间】:2012-03-21 07:44:36
【问题描述】:
在 PHP 中,filter_var('www.example.com', FILTER_VALIDATE_URL) 返回 false。它是否正确? www.example.com 不是一个有效的 URL,或者协议(http://、ftp:// 等)需要在 URL 中明确说明才能正式正确吗?
【问题讨论】:
在 PHP 中,filter_var('www.example.com', FILTER_VALIDATE_URL) 返回 false。它是否正确? www.example.com 不是一个有效的 URL,或者协议(http://、ftp:// 等)需要在 URL 中明确说明才能正式正确吗?
【问题讨论】:
这不是一个有效的 URL。使用http:// 前缀从来都不是一件对用户非常友好的事情,所以现代浏览器认为如果你只是输入一个域名,你的意思是http。软件库确实有点挑剔!
您可以采取的一种方法是将字符串传递给parse_url,然后添加任何缺少的元素,例如
if ( $parts = parse_url($url) ) {
if ( !isset($parts["scheme"]) )
{
$url = "http://$url";
}
}
有趣的是,当您使用 FILTER_VALIDATE_URL 时,它实际上在内部使用 parse_url 来确定方案是什么(view source)。感谢 salathe 在下面的 cmets 中发现了这一点。
【讨论】:
parse_url 方法,我比filter_var 更喜欢它
FILTER_VALIDATE_URL 使用parse_url() 检查是否有方案。
$parts["scheme"]=='http' 并将网址重构为https 吗?
URL 必须与 RFC 2396 中设置的规则相对应,并且根据该规范,协议是必需的。
【讨论】:
除了 Paul Dixon 的回答我想说的是,您可以使用 flags 代替 FILTER_VALIDATE_URL 来指定必须呈现 URL 的哪一部分。
FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
由于 PHP 5.2.1 默认使用 FILTER_FLAG_SCHEME_REQUIRED 和 FILTER_FLAG_HOST_REQUIRED 标志,不幸的是,没有办法禁用它们(如果URL方案部分的存在不一定)。这对我来说似乎是一个错误。有亲戚bugreport。
【讨论】:
FILTER_VALIDATE_URL 需要方案(“协议”)部分。
【讨论】: