summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2020-02-13 16:23:01 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-03-16 11:05:26 +0100
commit1668ad7cb17213e67e42994e0c6911e302a3c3c5 (patch)
tree2592f060147a1576ea2a6c5c42081749df5fdcac
parent934e60b5945945e8da79b6ab8f0ebf718a614e5d (diff)
downloadphp-git-1668ad7cb17213e67e42994e0c6911e302a3c3c5.tar.gz
Add str_contains() function
RFC: https://wiki.php.net/rfc/str_contains Closes GH-5179.
-rw-r--r--UPGRADING5
-rwxr-xr-xext/standard/basic_functions.c1
-rwxr-xr-xext/standard/basic_functions.stub.php2
-rwxr-xr-xext/standard/basic_functions_arginfo.h5
-rw-r--r--ext/standard/php_string.h1
-rw-r--r--ext/standard/string.c15
-rw-r--r--ext/standard/tests/strings/str_contains.phpt34
7 files changed, 62 insertions, 1 deletions
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--
+<?php
+/* Prototype: str_contains ( string $haystack , string $needle ) : bool
+ Description: Check if a string contains another string
+ Source code: ext/standard/string.c
+*/
+var_dump(str_contains("test string", "test"));
+var_dump(str_contains("test string", "string"));
+var_dump(str_contains("test string", "strin"));
+var_dump(str_contains("test string", "t s"));
+var_dump(str_contains("test string", "g"));
+var_dump(str_contains("te".chr(0)."st", chr(0)));
+var_dump(str_contains("tEst", "test"));
+var_dump(str_contains("teSt", "test"));
+var_dump(str_contains("", ""));
+var_dump(str_contains("a", ""));
+var_dump(str_contains("", "a"));
+var_dump(str_contains("\\\\a", "\\a"));
+?>
+--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)