1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
class Str extends Prefab |
4
|
|
|
{ |
5
|
|
|
protected static $snakeCache = []; |
6
|
|
|
protected static $camelCache = []; |
7
|
|
|
protected static $studlyCache = []; |
8
|
|
|
|
9
|
|
|
public static function after($subject, $search) |
10
|
|
|
{ |
11
|
|
|
return $search === '' ? $subject : array_reverse(explode($search, $subject, 2))[0]; |
12
|
|
|
} |
13
|
|
|
|
14
|
|
|
public static function before($subject, $search) |
15
|
|
|
{ |
16
|
|
|
return $search === '' ? $subject : explode($search, $subject)[0]; |
17
|
|
|
} |
18
|
|
|
|
19
|
|
|
public static function camel($value) |
20
|
|
|
{ |
21
|
|
|
if (isset(static::$camelCache[$value])) { |
22
|
|
|
return static::$camelCache[$value]; |
23
|
|
|
} |
24
|
|
|
|
25
|
|
|
return static::$camelCache[$value] = lcfirst(static::studly($value)); |
26
|
|
|
} |
27
|
|
|
|
28
|
|
|
public static function contains($haystack, $needles) |
29
|
|
|
{ |
30
|
|
|
foreach ((array) $needles as $needle) { |
31
|
|
|
if ($needle !== '' && mb_strpos($haystack, $needle) !== false) { |
32
|
|
|
return true; |
33
|
|
|
} |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
return false; |
37
|
|
|
} |
38
|
|
|
|
39
|
|
View Code Duplication |
public static function endsWith($haystack, $needles) |
|
|
|
|
40
|
|
|
{ |
41
|
|
|
foreach ((array) $needles as $needle) { |
42
|
|
|
if (substr($haystack, -strlen($needle)) === (string) $needle) { |
43
|
|
|
return true; |
44
|
|
|
} |
45
|
|
|
} |
46
|
|
|
|
47
|
|
|
return false; |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
public static function finish($value, $cap) |
51
|
|
|
{ |
52
|
|
|
$quoted = preg_quote($cap, '/'); |
53
|
|
|
|
54
|
|
|
return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
public static function is($pattern, $value) |
58
|
|
|
{ |
59
|
|
|
$patterns = is_array($pattern) ? $pattern : (array) $pattern; |
60
|
|
|
|
61
|
|
|
if (empty($patterns)) { |
62
|
|
|
return false; |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
foreach ($patterns as $pattern) { |
66
|
|
|
if ($pattern == $value) { |
67
|
|
|
return true; |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
$pattern = preg_quote($pattern, '#'); |
71
|
|
|
$pattern = str_replace('\*', '.*', $pattern); |
72
|
|
|
|
73
|
|
|
if (preg_match('#^'.$pattern.'\z#u', $value) === 1) { |
74
|
|
|
return true; |
75
|
|
|
} |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
return false; |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
public static function kebab($value) |
82
|
|
|
{ |
83
|
|
|
return static::snake($value, '-'); |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
public static function length($value, $encoding = null) |
87
|
|
|
{ |
88
|
|
|
if ($encoding) { |
89
|
|
|
return mb_strlen($value, $encoding); |
90
|
|
|
} |
91
|
|
|
|
92
|
|
|
return mb_strlen($value); |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
public static function limit($value, $limit = 100, $end = '...') |
96
|
|
|
{ |
97
|
|
|
if (mb_strwidth($value, 'UTF-8') <= $limit) { |
98
|
|
|
return $value; |
99
|
|
|
} |
100
|
|
|
|
101
|
|
|
return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
public static function lower($value) |
105
|
|
|
{ |
106
|
|
|
return mb_strtolower($value, 'UTF-8'); |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
public static function words($value, $words = 100, $end = '...') |
110
|
|
|
{ |
111
|
|
|
preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); |
112
|
|
|
|
113
|
|
|
if (!isset($matches[0]) || static::length($value) === static::length($matches[0])) { |
114
|
|
|
return $value; |
115
|
|
|
} |
116
|
|
|
|
117
|
|
|
return rtrim($matches[0]).$end; |
118
|
|
|
} |
119
|
|
|
|
120
|
|
|
public static function parseCallback($callback, $default = null) |
121
|
|
|
{ |
122
|
|
|
return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
public static function plural($value, $count = 2) |
126
|
|
|
{ |
127
|
|
|
return Pluralizer::plural($value, $count); |
|
|
|
|
128
|
|
|
} |
129
|
|
|
|
130
|
|
|
public static function random($length = 16) |
131
|
|
|
{ |
132
|
|
|
$string = ''; |
133
|
|
|
|
134
|
|
|
while (($len = strlen($string)) < $length) { |
135
|
|
|
$size = $length - $len; |
136
|
|
|
$bytes = random_bytes($size); |
137
|
|
|
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); |
138
|
|
|
} |
139
|
|
|
|
140
|
|
|
return $string; |
141
|
|
|
} |
142
|
|
|
|
143
|
|
|
public static function replaceArray($search, array $replace, $subject) |
144
|
|
|
{ |
145
|
|
|
foreach ($replace as $value) { |
146
|
|
|
$subject = static::replaceFirst($search, $value, $subject); |
147
|
|
|
} |
148
|
|
|
|
149
|
|
|
return $subject; |
150
|
|
|
} |
151
|
|
|
|
152
|
|
View Code Duplication |
public static function replaceFirst($search, $replace, $subject) |
|
|
|
|
153
|
|
|
{ |
154
|
|
|
if ($search == '') { |
155
|
|
|
return $subject; |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
$position = strpos($subject, $search); |
159
|
|
|
|
160
|
|
|
if ($position !== false) { |
161
|
|
|
return substr_replace($subject, $replace, $position, strlen($search)); |
162
|
|
|
} |
163
|
|
|
|
164
|
|
|
return $subject; |
165
|
|
|
} |
166
|
|
|
|
167
|
|
View Code Duplication |
public static function replaceLast($search, $replace, $subject) |
|
|
|
|
168
|
|
|
{ |
169
|
|
|
$position = strrpos($subject, $search); |
170
|
|
|
|
171
|
|
|
if ($position !== false) { |
172
|
|
|
return substr_replace($subject, $replace, $position, strlen($search)); |
173
|
|
|
} |
174
|
|
|
|
175
|
|
|
return $subject; |
176
|
|
|
} |
177
|
|
|
|
178
|
|
|
public static function start($value, $prefix) |
179
|
|
|
{ |
180
|
|
|
$quoted = preg_quote($prefix, '/'); |
181
|
|
|
return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); |
182
|
|
|
} |
183
|
|
|
|
184
|
|
|
public static function upper($value) |
185
|
|
|
{ |
186
|
|
|
return mb_strtoupper($value, 'UTF-8'); |
187
|
|
|
} |
188
|
|
|
|
189
|
|
|
public static function title($value) |
190
|
|
|
{ |
191
|
|
|
return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); |
192
|
|
|
} |
193
|
|
|
|
194
|
|
|
public static function singular($value) |
195
|
|
|
{ |
196
|
|
|
return Pluralizer::singular($value); |
197
|
|
|
} |
198
|
|
|
|
199
|
|
|
public static function slug($title, $separator = '-', $language = 'en') |
200
|
|
|
{ |
201
|
|
|
$title = static::ascii($title, $language); |
|
|
|
|
202
|
|
|
|
203
|
|
|
$flip = $separator == '-' ? '_' : '-'; |
204
|
|
|
|
205
|
|
|
$title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); |
206
|
|
|
$title = str_replace('@', $separator.'at'.$separator, $title); |
207
|
|
|
$title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title)); |
208
|
|
|
$title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); |
209
|
|
|
|
210
|
|
|
return trim($title, $separator); |
211
|
|
|
} |
212
|
|
|
|
213
|
|
|
public static function snake($value, $delimiter = '_') |
214
|
|
|
{ |
215
|
|
|
$key = $value; |
216
|
|
|
|
217
|
|
|
if (isset(static::$snakeCache[$key][$delimiter])) { |
218
|
|
|
return static::$snakeCache[$key][$delimiter]; |
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
if (!ctype_lower($value)) { |
222
|
|
|
$value = preg_replace('/\s+/u', '', ucwords($value)); |
223
|
|
|
|
224
|
|
|
$value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); |
225
|
|
|
} |
226
|
|
|
|
227
|
|
|
return static::$snakeCache[$key][$delimiter] = $value; |
228
|
|
|
} |
229
|
|
|
|
230
|
|
View Code Duplication |
public static function startsWith($haystack, $needles) |
|
|
|
|
231
|
|
|
{ |
232
|
|
|
foreach ((array) $needles as $needle) { |
233
|
|
|
if ($needle !== '' && substr($haystack, 0, strlen($needle)) === (string) $needle) { |
234
|
|
|
return true; |
235
|
|
|
} |
236
|
|
|
} |
237
|
|
|
|
238
|
|
|
return false; |
239
|
|
|
} |
240
|
|
|
|
241
|
|
|
public static function studly($value) |
242
|
|
|
{ |
243
|
|
|
$key = $value; |
244
|
|
|
|
245
|
|
|
if (isset(static::$studlyCache[$key])) { |
246
|
|
|
return static::$studlyCache[$key]; |
247
|
|
|
} |
248
|
|
|
|
249
|
|
|
$value = ucwords(str_replace(['-', '_'], ' ', $value)); |
250
|
|
|
|
251
|
|
|
return static::$studlyCache[$key] = str_replace(' ', '', $value); |
252
|
|
|
} |
253
|
|
|
|
254
|
|
|
public static function substr($string, $start, $length = null) |
255
|
|
|
{ |
256
|
|
|
return mb_substr($string, $start, $length, 'UTF-8'); |
257
|
|
|
} |
258
|
|
|
|
259
|
|
|
public static function ucfirst($string) |
260
|
|
|
{ |
261
|
|
|
return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); |
262
|
|
|
} |
263
|
|
|
} |
264
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.