Deprecate mb_ereg_replace with non-string pattern

I'm counting this towards the non-string needle deprecation from
https://wiki.php.net/rfc/deprecations_php_7_3. I wasn't aware that
mb_ereg_replace() is also affected by this issue. It's even more
ridiculous than usual here, because the integer is interpreted as
an ASCII codepoint, even though these are supposed to be multibyte
functions :(
This commit is contained in:
Nikita Popov 2019-02-01 14:58:10 +01:00
parent 882dcb43f7
commit e366ceebad
4 changed files with 49 additions and 2 deletions

View file

@ -139,6 +139,11 @@ PHP 7.4 UPGRADE NOTES
so is equivalent to calling a non-static method statically, which has been so is equivalent to calling a non-static method statically, which has been
deprecated since PHP 7.0. deprecated since PHP 7.0.
- Mbstring:
. Passing a non-string pattern to mb_ereg_replace() is deprecated. Currently
non-string patterns are interpreted as ASCII codepoints. In PHP 8 the
pattern will be interpreted as a string instead.
======================================== ========================================
5. Changed Functions 5. Changed Functions
======================================== ========================================

View file

@ -1049,6 +1049,10 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
arg_pattern = Z_STRVAL_P(arg_pattern_zval); arg_pattern = Z_STRVAL_P(arg_pattern_zval);
arg_pattern_len = Z_STRLEN_P(arg_pattern_zval); arg_pattern_len = Z_STRLEN_P(arg_pattern_zval);
} else { } else {
php_error_docref(NULL, E_DEPRECATED,
"Non-string patterns will be interpreted as strings in the future. "
"Use an explicit chr() call to preserve the current behavior");
/* FIXME: this code is not multibyte aware! */ /* FIXME: this code is not multibyte aware! */
convert_to_long_ex(arg_pattern_zval); convert_to_long_ex(arg_pattern_zval);
pat_buf[0] = (char)Z_LVAL_P(arg_pattern_zval); pat_buf[0] = (char)Z_LVAL_P(arg_pattern_zval);

View file

@ -14,6 +14,8 @@ var_dump($var1);
--EXPECTF-- --EXPECTF--
Notice: Undefined variable: var in %s on line %d Notice: Undefined variable: var in %s on line %d
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %sbug72994.php on line %d Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %sbug72994.php on line %d
bool(false) bool(false)
===DONE=== ===DONE===

View file

@ -100,52 +100,82 @@ echo "Done";
*** Testing mb_ereg_replace() : usage variations *** *** Testing mb_ereg_replace() : usage variations ***
-- Iteration 1 -- -- Iteration 1 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 2 -- -- Iteration 2 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 3 -- -- Iteration 3 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 4 -- -- Iteration 4 --
Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %smb_ereg_replace_variation1.php on line %d Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %s on line %d
bool(false) bool(false)
-- Iteration 5 -- -- Iteration 5 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 6 -- -- Iteration 6 --
Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %smb_ereg_replace_variation1.php on line %d Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
Warning: mb_ereg_replace(): mbregex compile err: invalid code point value in %s on line %d
bool(false) bool(false)
-- Iteration 7 -- -- Iteration 7 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 8 -- -- Iteration 8 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 9 -- -- Iteration 9 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 10 -- -- Iteration 10 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 11 -- -- Iteration 11 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 12 -- -- Iteration 12 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 13 -- -- Iteration 13 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 14 -- -- Iteration 14 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 15 -- -- Iteration 15 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 16 -- -- Iteration 16 --
@ -164,11 +194,17 @@ string(10) "string_val"
string(10) "string_val" string(10) "string_val"
-- Iteration 21 -- -- Iteration 21 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 22 -- -- Iteration 22 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
-- Iteration 23 -- -- Iteration 23 --
Deprecated: mb_ereg_replace(): Non-string patterns will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
string(10) "string_val" string(10) "string_val"
Done Done