From 1668ad7cb17213e67e42994e0c6911e302a3c3c5 Mon Sep 17 00:00:00 2001 From: Philipp Tanlak Date: Thu, 13 Feb 2020 16:23:01 +0100 Subject: [PATCH] Add str_contains() function RFC: https://wiki.php.net/rfc/str_contains Closes GH-5179. --- UPGRADING | 5 ++- ext/standard/basic_functions.c | 1 + ext/standard/basic_functions.stub.php | 2 ++ ext/standard/basic_functions_arginfo.h | 5 +++ ext/standard/php_string.h | 1 + ext/standard/string.c | 15 +++++++++ ext/standard/tests/strings/str_contains.phpt | 34 ++++++++++++++++++++ 7 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/strings/str_contains.phpt diff --git a/UPGRADING b/UPGRADING index 94cdc29c4f..95bc58655a 100644 --- a/UPGRADING +++ b/UPGRADING @@ -481,7 +481,10 @@ PHP 8.0 UPGRADE NOTES PR: https://github.com/php/php-src/pull/4797 - Standard: - . Added fdiv() method, which performs a floating-point division under + . Added str_contains($haystack, $needle) function, which checks whether + $haystack contains $needle as a sub-string. It is equivalent to writing + strpos($haystack, $needle) !== false. + . Added fdiv() function, which performs a floating-point division under IEEE 754 semantics. Division by zero is considered well-defined and will return one of Inf, -Inf or NaN. diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index e0b7760477..d15854f7ce 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -173,6 +173,7 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtok, arginfo_strtok) PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) + PHP_FE(str_contains, arginfo_str_contains) PHP_FE(strpos, arginfo_strpos) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 1e4cc22d00..c153b752e6 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -586,6 +586,8 @@ function strripos(string $haystack, string $needle, int $offset = 0): int|false function strrchr(string $haystack, string $needle): string|false {} +function str_contains(string $haystack, string $needle): bool {} + function chunk_split(string $str, int $chunklen = 76, string $ending = "\r\n"): string {} function substr(string $str, int $start, ?int $length = null): string|false {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index e7ae2a5a38..fa5e762c2e 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -918,6 +918,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strrchr, 0, 2, MAY_BE_STRING|MAY ZEND_ARG_TYPE_INFO(0, needle, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_str_contains, 0, 2, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, haystack, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, needle, IS_STRING, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chunk_split, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, str, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, chunklen, IS_LONG, 0) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 7753bb6b46..9e94910bf3 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -39,6 +39,7 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); +PHP_FUNCTION(str_contains); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index 363117fce8..b242a44e0b 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1851,6 +1851,21 @@ PHP_FUNCTION(strstr) } /* }}} */ +/* {{{ proto bool str_contains(string haystack, string needle) + Checks if a string contains another */ +PHP_FUNCTION(str_contains) +{ + zend_string *haystack, *needle; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); + + RETURN_BOOL(php_memnstr(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack))); +} +/* }}} */ + /* {{{ proto string strchr(string haystack, string needle) An alias for strstr */ /* }}} */ diff --git a/ext/standard/tests/strings/str_contains.phpt b/ext/standard/tests/strings/str_contains.phpt new file mode 100644 index 0000000000..f54cd1c00c --- /dev/null +++ b/ext/standard/tests/strings/str_contains.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test str_contains() function +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) +bool(true) -- 2.40.0