From 20682176e48136ed3ed90b6502e4e0701aa31076 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 17:39:38 +0800 Subject: [PATCH 1/3] support \f in `trim`, `rtrim` and `ltrim` --- ext/standard/basic_functions.stub.php | 8 ++++---- ext/standard/string.c | 8 ++++---- tests/classes/tostring_001.phpt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index e27dca069c55b..fb1e6277b73ab 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2310,16 +2310,16 @@ function strcoll(string $string1, string $string2): int {} * @frameless-function {"arity": 1} * @frameless-function {"arity": 2} */ -function trim(string $string, string $characters = " \n\r\t\v\0"): string {} +function trim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function rtrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @alias rtrim */ -function chop(string $string, string $characters = " \n\r\t\v\0"): string {} +function chop(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function ltrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** * @compile-time-eval diff --git a/ext/standard/string.c b/ext/standard/string.c index 0b7d5be1a2576..3455379f0f468 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index e9ef7b4175832..ffbd7692727de 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -12,7 +12,7 @@ class test2 function __toString() { echo __METHOD__ . "()\n"; - return "Converted\n"; + return "\fConverted\n"; } } From c71ffe83e1da36484e5a1b13efb3d84f9e1b235e Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 17:53:07 +0800 Subject: [PATCH 2/3] do not touch php_trim --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3455379f0f468..0b7d5be1a2576 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { From 99b9b3392822a9756ab203ae255fffea5e162a66 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 18:16:49 +0800 Subject: [PATCH 3/3] For sure we need to touch php_trim XD --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 0b7d5be1a2576..3455379f0f468 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) {