REGISTER_LONG_CONSTANT("FILTER_REQUIRE_SCALAR", FILTER_REQUIRE_SCALAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_REQUIRE_ARRAY", FILTER_REQUIRE_ARRAY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_FORCE_ARRAY", FILTER_FORCE_ARRAY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILTER_NULL_ON_FAILURE", FILTER_NULL_ON_FAILURE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_VALIDATE_INT", FILTER_VALIDATE_INT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_VALIDATE_BOOLEAN", FILTER_VALIDATE_BOOLEAN, CONST_CS | CONST_PERSISTENT);
SEPARATE_ZVAL(filtered);
}
zval_dtor(*filtered);
- ZVAL_FALSE(*filtered);
+ if (filter_flags & FILTER_NULL_ON_FAILURE) {
+ ZVAL_NULL(*filtered);
+ } else {
+ ZVAL_FALSE(*filtered);
+ }
return;
}
php_zval_filter_recursive(filtered, filter, filter_flags, options, charset, copy TSRMLS_CC);
SEPARATE_ZVAL(filtered);
}
zval_dtor(*filtered);
- ZVAL_FALSE(*filtered);
+ if (filter_flags & FILTER_NULL_ON_FAILURE) {
+ ZVAL_NULL(*filtered);
+ } else {
+ ZVAL_FALSE(*filtered);
+ }
return;
}
int var_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls|lZ", &fetch_from, &var, &var_len, &filter, &filter_args) == FAILURE) {
- RETURN_FALSE;
+ return;
}
input = php_filter_get_storage(fetch_from TSRMLS_CC);
if (!input || !HASH_OF(input) || zend_hash_find(HASH_OF(input), var, var_len + 1, (void **)&tmp) != SUCCESS) {
- RETURN_FALSE;
+ long filter_flags = 0;
+ zval **option;
+ if (filter_args) {
+ if (Z_TYPE_PP(filter_args) == IS_LONG) {
+ filter_flags = Z_LVAL_PP(filter_args);
+ } else if (Z_TYPE_PP(filter_args) == IS_ARRAY && zend_hash_find(HASH_OF(*filter_args), "flags", sizeof("flags"), (void **)&option) == SUCCESS) {
+ convert_to_long(*option);
+ filter_flags = Z_LVAL_PP(option);
+ }
+ }
+ if (filter_flags & FILTER_NULL_ON_FAILURE) {
+ RETURN_FALSE;
+ } else {
+ RETURN_NULL();
+ }
}
*return_value = **tmp;
zval **filter_args = NULL, *data;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/|lZ", &data, &filter, &filter_args) == FAILURE) {
- RETURN_FALSE;
+ return;
}
*return_value = *data;
zval *array_input = NULL, **op = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|Z", &fetch_from, &op) == FAILURE) {
- RETURN_FALSE;
+ return;
}
array_input = php_filter_get_storage(fetch_from TSRMLS_CC);
if (!array_input || !HASH_OF(array_input)) {
- RETURN_FALSE;
+ long filter_flags = 0;
+ zval **option;
+ if (op) {
+ if (Z_TYPE_PP(op) == IS_LONG) {
+ filter_flags = Z_LVAL_PP(op);
+ } else if (Z_TYPE_PP(op) == IS_ARRAY && zend_hash_find(HASH_OF(*op), "flags", sizeof("flags"), (void **)&option) == SUCCESS) {
+ convert_to_long(*option);
+ filter_flags = Z_LVAL_PP(option);
+ }
+ }
+ if (filter_flags & FILTER_NULL_ON_FAILURE) {
+ RETURN_FALSE;
+ } else {
+ RETURN_NULL();
+ }
}
php_filter_array_handler(array_input, op, return_value TSRMLS_CC);
zval *array_input = NULL, **op = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|Z", &array_input, &op) == FAILURE) {
- RETURN_FALSE;
+ return;
}
php_filter_array_handler(array_input, op, return_value TSRMLS_CC);
#define FILTER_REQUIRE_SCALAR 0x2000000
#define FILTER_FORCE_ARRAY 0x4000000
+#define FILTER_NULL_ON_FAILURE 0x8000000
#define FILTER_FLAG_ALLOW_OCTAL 0x0001
#define FILTER_FLAG_ALLOW_HEX 0x0002
#define FORMAT_IPV4 4
#define FORMAT_IPV6 6
+#define RETURN_VALIDATION_FAILED \
+ zval_dtor(value); \
+ if (flags & FILTER_NULL_ON_FAILURE) { \
+ ZVAL_NULL(value); \
+ } else { \
+ ZVAL_FALSE(value); \
+ } \
+ return; \
+
static int php_filter_parse_int(const char *str, unsigned int str_len, long *ret TSRMLS_DC) { /* {{{ */
long ctx_value = 0;
long sign = 1;
len = Z_STRLEN_P(value);
if (len == 0) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
if (option_flags & FILTER_FLAG_ALLOW_OCTAL) {
}
if (error > 0 || (min_range_set && (ctx_value < min_range)) || (max_range_set && (ctx_value > max_range))) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
} else {
zval_dtor(value);
Z_TYPE_P(value) = IS_LONG;
if (len>0) {
PHP_FILTER_TRIM_DEFAULT(str, len, end);
} else {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
/* returns true for "1", "true", "on" and "yes"
{
zval_dtor(value);
ZVAL_BOOL(value, 1);
- } else {
+ } else if ((strncasecmp(str, "false", sizeof("false")) == 0) ||
+ (strncasecmp(str, "no", sizeof("no")) == 0) ||
+ (strncasecmp(str, "off", sizeof("off")) == 0) ||
+ (strncmp(str, "0", sizeof("0")) == 0))
+ {
zval_dtor(value);
ZVAL_BOOL(value, 0);
+ } else {
+ RETURN_VALIDATION_FAILED
}
}
/* }}} */
len = Z_STRLEN_P(value);
if (len < 1) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
str = Z_STRVAL_P(value);
return;
stateError:
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
}
/* }}} */
if (!regexp_set) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "'regexp' option missing");
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
re = pcre_get_compiled_regex(regexp, &pcre_extra, &preg_options TSRMLS_CC);
if (!re) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
}
matches = pcre_exec(re, NULL, Z_STRVAL_P(value), Z_STRLEN_P(value), 0, 0, ovector, 3);
/* 0 means that the vector is too small to hold all the captured substring offsets */
if (matches < 0) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
}
}
/* }}} */
url = php_url_parse_ex(Z_STRVAL_P(value), Z_STRLEN_P(value));
if (url == NULL) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
- if ((flags & FILTER_FLAG_SCHEME_REQUIRED) && url->scheme == NULL) {
- zval_dtor(value);
- ZVAL_NULL(value);
- }
- if ((flags & FILTER_FLAG_HOST_REQUIRED) && url->host == NULL) {
- zval_dtor(value);
- ZVAL_NULL(value);
- }
- if ((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) {
- zval_dtor(value);
- ZVAL_NULL(value);
- }
- if ((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ if (
+ ((flags & FILTER_FLAG_SCHEME_REQUIRED) && url->scheme == NULL) ||
+ ((flags & FILTER_FLAG_HOST_REQUIRED) && url->host == NULL) ||
+ ((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) ||
+ ((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL)
+ ) {
+ php_url_free(url);
+ RETURN_VALIDATION_FAILED
}
php_url_free(url);
}
re = pcre_get_compiled_regex((char *)regexp, &pcre_extra, &preg_options TSRMLS_CC);
if (!re) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
}
matches = pcre_exec(re, NULL, Z_STRVAL_P(value), Z_STRLEN_P(value), 0, 0, ovector, 3);
/* 0 means that the vector is too small to hold all the captured substring offsets */
if (matches < 0) {
- zval_dtor(value);
- ZVAL_NULL(value);
+ RETURN_VALIDATION_FAILED
}
}
} else if (strchr(str, '.')) {
mode = FORMAT_IPV4;
} else {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
if (flags & (FILTER_FLAG_IPV4 || FILTER_FLAG_IPV6)) {
/* Both formats are cool */
} else if ((flags & FILTER_FLAG_IPV4) && mode == FORMAT_IPV6) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
} else if ((flags & FILTER_FLAG_IPV6) && mode == FORMAT_IPV4) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
switch (mode) {
case FORMAT_IPV4:
if (!_php_filter_validate_ipv4(str, ip TSRMLS_CC)) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
/* Check flags */
(ip[0] == 172 && (ip[1] >= 16 && ip[1] <= 31)) ||
(ip[0] == 192 && ip[1] == 168)
) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
}
(ip[0] == 192 && ip[1] == 0 && ip[2] == 2) ||
(ip[0] >= 224 && ip[0] <= 255)
) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
}
break;
int res = 0;
res = _php_filter_validate_ipv6_(str TSRMLS_CC);
if (res < 1) {
- zval_dtor(value);
- ZVAL_NULL(value);
- return;
+ RETURN_VALIDATION_FAILED
}
}
break;
[1]=>
int(1)
[2]=>
- NULL
+ bool(false)
[3]=>
int(-23234)
[4]=>
- NULL
+ bool(false)
[5]=>
- NULL
+ bool(false)
[6]=>
array(0) {
}
[1]=>
float(1.7)
[2]=>
- NULL
+ bool(false)
[3]=>
float(-23234.123)
[4]=>
- NULL
+ bool(false)
[5]=>
- NULL
+ bool(false)
[6]=>
array(0) {
}
}
-Warning: filter_var() expects parameter 2 to be long, array given in %s on line %d
-bool(false)
+Warning: filter_var() expects parameter 2 to be long, array given in /home4/php_dev/php52/ext/filter/tests/010.php on line 5
+NULL
string(1) "1"
string(1) "1"
string(1) "1"
echo "Done\n";
?>
--EXPECT--
-bool(false)
-bool(false)
-bool(false)
+NULL
+NULL
+NULL
Done
int(7)
int(16711680)
int(438)
-NULL
+bool(false)
int(0)
int(0)
-NULL
-NULL
-NULL
-NULL
-NULL
-NULL
-NULL
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
int(6)
-NULL
-NULL
+bool(false)
+bool(false)
int(-1)
-NULL
-NULL
-NULL
-NULL
-NULL
-NULL
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
Done
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
+bool(false)
bool(false)
-NULL
bool(false)
array(5) {
[0]=>
[4]=>
array(2) {
[0]=>
- NULL
+ bool(false)
[1]=>
bool(false)
}
bool(false)
bool(true)
bool(false)
-NULL
+bool(false)
bool(false)
bool(false)
bool(false)
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(29) "http://example.com/index.html"
string(32) "http://www.example.com/index.php"
string(31) "http://www.example/img/test.png"
string(26) "ftp://ftp.example.com/tmp/"
string(11) "/tmp/test.c"
string(1) "/"
-NULL
+bool(false)
string(6) "http:/"
string(5) "http:"
string(4) "http"
string(0) ""
string(2) "-1"
bool(false)
-NULL
+bool(false)
string(10) "http://qwe"
-NULL
-NULL
+bool(false)
+bool(false)
string(22) "http://www.example.com"
-NULL
+bool(false)
string(42) "http://www.example.com/path/at/the/server/"
-NULL
+bool(false)
string(40) "http://www.example.com/index.php?a=b&c=d"
Done
--EXPECT--
string(5) "a@b.c"
string(17) "abuse@example.com"
-NULL
-NULL
-NULL
-NULL
-NULL
-NULL
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
string(57) "QWERTYUIOPASDFGHJKLZXCVBNM@QWERTYUIOPASDFGHJKLZXCVBNM.NET"
Done
?>
--EXPECTF--
string(4) "data"
-NULL
+bool(false)
string(4) "data"
-NULL
-NULL
+bool(false)
+bool(false)
Warning: filter_var(): 'regexp' option missing in %s on line %d
-NULL
+bool(false)
Done
?>
--EXPECT--
string(11) "192.168.0.1"
-NULL
+bool(false)
string(3) "::1"
string(7) "fe00::0"
-NULL
-NULL
+bool(false)
+bool(false)
string(9) "127.0.0.1"
-NULL
+bool(false)
string(12) "192.0.34.166"
string(9) "127.0.0.1"
string(9) "192.0.0.1"
string(12) "192.0.34.166"
-NULL
+bool(false)
string(15) "255.255.255.255"
-NULL
-NULL
-NULL
-NULL
-NULL
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
string(3) "::1"
string(9) "127.0.0.1"
Done
echo "Done\n";
?>
---EXPECTF--
-NULL
-NULL
-NULL
-NULL
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
string(7) "1.1.1.1"
Done
);
foreach ($ipv6_test as $ip => $exp) {
$out = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
- $out = (int) ($out === null ? 0 : 1);
+ $out = (int) ($out === false ? 0 : 1);
if ($exp != $out) {
echo "$ip failed\n";
}
float(0.007)
custom decimal:
-NULL
+bool(false)
float(1.234)
float(1.234)
Warning: filter_var(): decimal separator must be one char in %s on line %d
-NULL
-NULL
+bool(false)
+bool(false)
'faLsE' => false,
'oFf' => false,
-'' => null
+'' => false
);
foreach($booleans as $val=>$exp) {
$res =filter_var($val, FILTER_VALIDATE_BOOLEAN);
- if ($res !== $exp) {
+ if ($res !== $exp) {
echo "$val failed,'$exp' expect, '$res' received.\n";
}
}
$var="3".chr(0)."foo";
var_dump(filter_var($var, FILTER_VALIDATE_FLOAT));
?>
---EXPECTF--
-NULL
-NULL
+--EXPECT--
+bool(false)
+bool(false)
int(-123)
int(0)
int(123)
-NULL
+bool(false)
float(-0.123)
float(0)
float(-1.23)
float(0)
float(1.23)
-NULL
+bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
-NULL
-NULL
+bool(false)
+bool(false)