diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index e0b7760477d37..d15854f7ce038 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 1e4cc22d00ec2..4bb713578698b 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -574,6 +574,8 @@ function stristr(string $haystack, string $needle, bool $before_needle = false): function strstr(string $haystack, string $needle, bool $before_needle = false): string|false {} +function str_contains(string $haystack, string $needle): bool {} + function strchr(string $haystack, string $needle, bool $before_needle = false): string|false {} function strpos(string $haystack, string $needle, int $offset = 0): int|false {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index e7ae2a5a384c4..7314aa4af3cb0 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -899,6 +899,11 @@ ZEND_END_ARG_INFO() #define arginfo_strstr arginfo_stristr +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() + #define arginfo_strchr arginfo_stristr ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strpos, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 7753bb6b46a79..9e94910bf3c18 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 363117fce86a4..b242a44e0bcde 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 0000000000000..f54cd1c00c4b2 --- /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)