]> granicus.if.org Git - php/commitdiff
Add str_contains() function
authorPhilipp Tanlak <philipp.tanlak@gmail.com>
Thu, 13 Feb 2020 15:23:01 +0000 (16:23 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 16 Mar 2020 10:05:26 +0000 (11:05 +0100)
RFC: https://wiki.php.net/rfc/str_contains

Closes GH-5179.

UPGRADING
ext/standard/basic_functions.c
ext/standard/basic_functions.stub.php
ext/standard/basic_functions_arginfo.h
ext/standard/php_string.h
ext/standard/string.c
ext/standard/tests/strings/str_contains.phpt [new file with mode: 0644]

index 94cdc29c4f382878656f6ea3c1044d8e5ab07710..95bc58655ad44220e12ad770fc05da30bf4067a5 100644 (file)
--- 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.
 
index e0b7760477d37fc066f29749ab2be45bd042a393..d15854f7ce038f66572c95d1fe9e791ea39dbe14 100755 (executable)
@@ -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)
index 1e4cc22d00ec23af147cb08367b05dc1bfe3d353..c153b752e6293d51459a8fb4ea6c59af163a005c 100755 (executable)
@@ -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 {}
index e7ae2a5a384c436232e8f03a41266765a5aa79bf..fa5e762c2e627e6da67162bcffaed23c122bb671 100755 (executable)
@@ -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)
index 7753bb6b46a790c5aa707b250510fc684ea14faf..9e94910bf3c18b354dd3a47d630fc8aaf0c6d798 100644 (file)
@@ -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);
index 363117fce86a43ef501826bcf5ffb0748d01ecc0..b242a44e0bcdebafde13fc0d7df15b86743841c6 100644 (file)
@@ -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 (file)
index 0000000..f54cd1c
--- /dev/null
@@ -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)