From 5994551d5d95258366dc5ce08bbb3a85571ba440 Mon Sep 17 00:00:00 2001 From: Philipp Tanlak Date: Thu, 13 Feb 2020 16:23:01 +0100 Subject: [PATCH 1/2] Create str_contains php function --- 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 +++++++++++++++ 5 files changed, 24 insertions(+) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f6d513f53d224..91cae1e5fc299 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 2a427b8ab8444..39cc620e749b8 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -553,6 +553,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 strpos(string $haystack, string $needle, int $offset = 0): int|false {} function stripos(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 93e2a5bda69f5..50f1b536c102a 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -877,6 +877,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() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strpos, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, haystack, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, needle, IS_STRING, 0) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 2c3953b958699..592be617117f2 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 6fb9683c5ad37..3064e86261626 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 */ /* }}} */ From 8a60b3c7ac60c19c135786aa1443197fe3d3a6a1 Mon Sep 17 00:00:00 2001 From: Philipp Tanlak Date: Fri, 13 Mar 2020 09:56:41 +0100 Subject: [PATCH 2/2] Add tests for str_contains() function --- ext/standard/tests/strings/str_contains.phpt | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ext/standard/tests/strings/str_contains.phpt 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)