使用filter_var

时间:2015-06-01 13:41:31

标签: php validation

我正在尝试使用PHP的filter_var()扩展程序进行验证。每http://php.net/manual/en/filter.filters.validate.php

  

将值验证为URL(根据»   http://www.faqs.org/rfcs/rfc2396),可选择必填项   组件。请注意,有效的URL可能未指定HTTP协议   http://因此可能需要进一步验证以确定URL   使用预期的协议,例如ssh://或mailto:。请注意   函数只能找到有效的ASCII URL;国际   域名(包含非ASCII字符)将失败。

关于注意有效URL可能未指定HTTP协议,我的测试表明需要HTTP协议(URL 'stackoverflow.com/' is NOT considered valid.)。我怎么会误解文档?

此外,https://https://stackoverflow.com/等网址如何阻止验证为真?

PS。对我对消毒协议进行消毒的方法提出任何意见将不胜感激。

<?php
function filterURL($url) {
    echo("URL '{$url}' is ".(filter_var($url, FILTER_VALIDATE_URL)?'':' NOT ').'considered valid.<br>');
}
function sanitizeURL($url) {
    return (strtolower(substr($url,0,7))=='http://' || strtolower(substr($url,0,8))=='https://')?$url:'http://'.$url;
}

filterURL('http://stackoverflow.com/');
filterURL('https://stackoverflow.com/');
filterURL('//stackoverflow.com/');
filterURL('stackoverflow.com/');
filterURL(sanitizeURL('http://stackoverflow.com/'));
filterURL(sanitizeURL('https://stackoverflow.com/'));
filterURL(sanitizeURL('stackoverflow.com/'));

filterURL('https://https://stackoverflow.com/');
?>

输出:

URL 'http://stackoverflow.com/' is considered valid.
URL 'https://stackoverflow.com/' is considered valid.
URL '//stackoverflow.com/' is NOT considered valid.
URL 'stackoverflow.com/' is NOT considered valid.
URL 'http://stackoverflow.com/' is considered valid.
URL 'https://stackoverflow.com/' is considered valid.
URL 'http://stackoverflow.com/' is considered valid.
URL 'https://https://stackoverflow.com/' is considered valid.

3 个答案:

答案 0 :(得分:3)

FILTER_VALIDATE_URL使用parse_url(),它不幸地将'https://https://'解析为有效的网址(因为它确实是考虑URI RFC的有效网址):

var_dump(parse_url('https://https://stackoverflow.com/'));

array(3) { 
  ["scheme"]=> string(5) "https" 
  ["host"]=> string(5) "https"
  ["path"]=> string(20) "//stackoverflow.com/" 
}

您可以将sanitazeURL功能更改为:

function sanitizeURL($url) {
  return (parse_url($url, PHP_URL_SCHEME)) ? $url : 'http://' . $url;
}

但您仍需检查主持人名称是http还是https

function filterURL($url) {
  echo("URL '{$url}' is ".((filter_var($url, FILTER_VALIDATE_URL) !== false && (parse_url($url, PHP_URL_HOST) !== 'http' && parse_url($url, PHP_URL_HOST) !== 'https'))?'':' NOT ').'considered valid.<br>');
}

答案 1 :(得分:0)

您可以删除http或通过验证是否存在来添加它。

belongs_to

答案 2 :(得分:-1)

  

我如何误解文档?

规范没有说明没有协议 - 它只是声明协议可能不是HTTP。

你在引用中扼杀了句子的重要部分......

  

请注意,有效的URL可能未指定HTTP协议http:// 所以   可能需要进一步验证以确定URL使用   预期的协议

协议预期可能是也可能不是