19
19
*/
20
20
final class Php84
21
21
{
22
- private const CHARACTERS = " \f\n\r\t\v\x00\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}" ;
23
-
24
22
public static function mb_ucfirst (string $ string , ?string $ encoding = null ): string
25
23
{
26
24
if (null === $ encoding ) {
@@ -113,20 +111,20 @@ public static function array_all(array $array, callable $callback): bool
113
111
114
112
public static function mb_trim (string $ string , ?string $ characters = null , ?string $ encoding = null ): string
115
113
{
116
- return self ::mb_internal_trim ('^[%s]+|[%s]+$ ' , $ string , $ characters , $ encoding );
114
+ return self ::mb_internal_trim ('{ ^[%s]+|[%1$ s]+$}Du ' , $ string , $ characters , $ encoding, __FUNCTION__ );
117
115
}
118
116
119
117
public static function mb_ltrim (string $ string , ?string $ characters = null , ?string $ encoding = null ): string
120
118
{
121
- return self ::mb_internal_trim ('^[%s]+ ' , $ string , $ characters , $ encoding );
119
+ return self ::mb_internal_trim ('{ ^[%s]+}Du ' , $ string , $ characters , $ encoding, __FUNCTION__ );
122
120
}
123
121
124
122
public static function mb_rtrim (string $ string , ?string $ characters = null , ?string $ encoding = null ): string
125
123
{
126
- return self ::mb_internal_trim ('[%s]+$ ' , $ string , $ characters , $ encoding );
124
+ return self ::mb_internal_trim ('{ [%s]+$}Du ' , $ string , $ characters , $ encoding, __FUNCTION__ );
127
125
}
128
126
129
- private static function mb_internal_trim (string $ regex , string $ string , ?string $ characters = null , ?string $ encoding = null ): string
127
+ private static function mb_internal_trim (string $ regex , string $ string , ?string $ characters , ?string $ encoding, string $ function ): string
130
128
{
131
129
if (null === $ encoding ) {
132
130
$ encoding = mb_internal_encoding ();
@@ -135,41 +133,40 @@ private static function mb_internal_trim(string $regex, string $string, ?string
135
133
try {
136
134
$ validEncoding = @mb_check_encoding ('' , $ encoding );
137
135
} catch (\ValueError $ e ) {
138
- throw new \ValueError (sprintf ('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given. ' , debug_backtrace ()[ 1 ][ ' function ' ] , $ encoding ));
136
+ throw new \ValueError (sprintf ('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given ' , $ function , $ encoding ));
139
137
}
140
138
141
139
// BC for PHP 7.3 and lower
142
140
if (!$ validEncoding ) {
143
- throw new \ValueError (sprintf ('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given. ' , debug_backtrace ()[ 1 ][ ' function ' ] , $ encoding ));
141
+ throw new \ValueError (sprintf ('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given ' , $ function , $ encoding ));
144
142
}
145
143
146
144
if ('' === $ characters ) {
147
145
return null === $ encoding ? $ string : mb_convert_encoding ($ string , $ encoding );
148
146
}
149
147
150
- if (null === $ characters ) {
151
- $ characters = self :: CHARACTERS ;
148
+ if (' UTF-8 ' === $ encoding || \in_array ( strtolower ( $ encoding ), [ ' utf-8 ' , ' utf8 ' ], true ) ) {
149
+ $ encoding = ' UTF-8 ' ;
152
150
}
153
151
154
- $ regexCharacter = preg_quote ($ characters ?? '' , '/ ' );
155
- $ regex = sprintf ($ regex , $ regexCharacter , $ regexCharacter );
152
+ $ string = mb_convert_encoding ($ string , 'UTF-8 ' , $ encoding );
156
153
157
- if ('ASCII ' === mb_detect_encoding ($ characters ) && 'ASCII ' === mb_detect_encoding ($ string ) && !empty (array_intersect (str_split (self ::CHARACTERS ), str_split ($ string )))) {
158
- $ options = 'g ' ;
154
+ if (null !== $ characters ) {
155
+ $ characters = mb_convert_encoding ($ characters , 'UTF-8 ' , $ encoding );
156
+ }
157
+
158
+ if (null === $ characters ) {
159
+ $ characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}" ;
159
160
} else {
160
- $ options = '' ;
161
+ $ characters = preg_quote ( $ characters ) ;
161
162
}
162
-
163
- try {
164
- $ test = mb_ereg_replace ($ regex , "" , $ string , $ options );
165
163
166
- if (null === $ test ) {
167
- throw new \Exception ();
168
- }
164
+ $ string = preg_replace (sprintf ($ regex , $ characters ), '' , $ string );
169
165
170
- return $ test ;
171
- } catch (\Exception $ e ) {
172
- return preg_replace (sprintf ('/%s/ ' , $ regex ), "" , $ string );
166
+ if ('UTF-8 ' === $ encoding ) {
167
+ return $ string ;
173
168
}
174
- }
169
+
170
+ return mb_convert_encoding ($ string , $ encoding , 'UTF-8 ' );
171
+ }
175
172
}
0 commit comments