GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — develop ( 9cb451...94f17b )
by Baptiste
02:15
created

Str::pregQuote()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Innmind\Immutable;
5
6
use Innmind\Immutable\Exception\RegexException;
7
use Innmind\Immutable\Exception\SubstringException;
8
9
class Str implements PrimitiveInterface, StringableInterface
10
{
11
    const PAD_RIGHT = STR_PAD_RIGHT;
12
    const PAD_LEFT = STR_PAD_LEFT;
13
    const PAD_BOTH = STR_PAD_BOTH;
14
    const PREG_NO_FLAGS = 0;
15
    const PREG_SPLIT_NO_EMPTY = PREG_SPLIT_NO_EMPTY;
16
    const PREG_SPLIT_DELIM_CAPTURE = PREG_SPLIT_DELIM_CAPTURE;
17
    const PREG_SPLIT_OFFSET_CAPTURE = PREG_SPLIT_OFFSET_CAPTURE;
18
    const PREG_OFFSET_CAPTURE = PREG_OFFSET_CAPTURE;
19
20
    private $value;
21
22 168
    public function __construct(string $value)
23
    {
24 168
        $this->value = $value;
25 168
    }
26
27
    /**
28
     * {@inheritdoc}
29
     */
30 2
    public function toPrimitive()
31
    {
32 2
        return $this->value;
33
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38 108
    public function __toString(): string
39
    {
40 108
        return $this->value;
41
    }
42
43
    /**
44
     * Split the string into a collection of ones
45
     *
46
     * @param string $delimiter
47
     *
48
     * @return StreamInterface<self>
0 ignored issues
show
Documentation introduced by
The doc-type StreamInterface<self> could not be parsed: Expected "|" or "end of type", but got "<" at position 15. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
49
     */
50 4 View Code Duplication
    public function split(string $delimiter = null): StreamInterface
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
51
    {
52 4
        $parts = empty($delimiter) ?
53 4
                str_split($this->value) : explode($delimiter, $this->value);
54 4
        $stream = new Stream(self::class);
55
56 4
        foreach ($parts as $part) {
57 4
            $stream = $stream->add(new self($part));
1 ignored issue
show
Documentation introduced by
new self($part) is of type object<Innmind\Immutable\Str>, but the function expects a object<Innmind\Immutable\T>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
58
        }
59
60 4
        return $stream;
61
    }
62
63
    /**
64
     * Returns a collection of the string splitted by the given chunk size
65
     *
66
     * @param int $size
67
     *
68
     * @return StreamInterface<self>
0 ignored issues
show
Documentation introduced by
The doc-type StreamInterface<self> could not be parsed: Expected "|" or "end of type", but got "<" at position 15. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
69
     */
70 2 View Code Duplication
    public function chunk(int $size = 1): StreamInterface
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
71
    {
72 2
        $pieces = str_split($this->value, $size);
73 2
        $stream = new Stream(self::class);
74
75 2
        foreach ($pieces as $piece) {
76 2
            $stream = $stream->add(new self($piece));
1 ignored issue
show
Documentation introduced by
new self($piece) is of type object<Innmind\Immutable\Str>, but the function expects a object<Innmind\Immutable\T>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
77
        }
78
79 2
        return $stream;
80
    }
81
82
    /**
83
     * Returns the position of the first occurence of the string
84
     *
85
     * @param string $needle
86
     * @param int $offset
87
     *
88
     * @throws SubstringException If the string is not found
89
     *
90
     * @return int
91
     */
92 8 View Code Duplication
    public function position(string $needle, int $offset = 0): int
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
93
    {
94 8
        $position = mb_strpos($this->value, $needle, $offset);
95
96 8
        if ($position === false) {
97 4
            throw new SubstringException(sprintf(
98 4
                'Substring "%s" not found',
99
                $needle
100
            ));
101
        }
102
103 6
        return (int) $position;
104
    }
105
106
    /**
107
     * Replace all occurences of the search string with the replacement one
108
     *
109
     * @param string $search
110
     * @param string $replacement
111
     *
112
     * @return self
113
     */
114 2
    public function replace(string $search, string $replacement): self
115
    {
116 2
        return new self(str_replace(
117 2
            (string) $search,
118 2
            (string) $replacement,
119 2
            $this->value
120
        ));
121
    }
122
123
    /**
124
     * Returns the string following the given delimiter
125
     *
126
     * @param string $delimiter
127
     *
128
     * @throws SubstringException If the string is not found
129
     *
130
     * @return self
131
     */
132 4 View Code Duplication
    public function str(string $delimiter): self
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
133
    {
134 4
        $sub = mb_strstr($this->value, $delimiter);
135
136 4
        if ($sub === false) {
137 2
            throw new SubstringException(sprintf(
138 2
                'Substring "%s" not found',
139
                $delimiter
140
            ));
141
        }
142
143 2
        return new self($sub);
144
    }
145
146
    /**
147
     * Return the string in upper case
148
     *
149
     * @return self
150
     */
151 2
    public function toUpper(): self
152
    {
153 2
        return new self(mb_strtoupper($this->value));
154
    }
155
156
    /**
157
     * Return the string in lower case
158
     *
159
     * @return self
160
     */
161 2
    public function toLower(): self
162
    {
163 2
        return new self(mb_strtolower($this->value));
164
    }
165
166
    /**
167
     * Return the string length
168
     *
169
     * @return int
170
     */
171 4
    public function length(): int
172
    {
173 4
        return strlen($this->value);
174
    }
175
176
    /**
177
     * Reverse the string
178
     *
179
     * @return self
180
     */
181 2
    public function reverse(): self
182
    {
183 2
        return new self(strrev($this->value));
184
    }
185
186
    /**
187
     * Pad to the right
188
     *
189
     * @param int $length
190
     * @param string $character
191
     *
192
     * @return self
193
     */
194 2
    public function rightPad(int $length, string $character = ' '): self
195
    {
196 2
        return $this->pad($length, $character, self::PAD_RIGHT);
197
    }
198
199
    /**
200
     * Pad to the left
201
     *
202
     * @param int $length
203
     * @param string $character
204
     *
205
     * @return self
206
     */
207 2
    public function leftPad(int $length, string $character = ' '): self
208
    {
209 2
        return $this->pad($length, $character, self::PAD_LEFT);
210
    }
211
212
    /**
213
     * Pad both sides
214
     *
215
     * @param int $length
216
     * @param string $character
217
     *
218
     * @return self
219
     */
220 2
    public function uniPad(int $length, string $character = ' '): self
221
    {
222 2
        return $this->pad($length, $character, self::PAD_BOTH);
223
    }
224
225
    /**
226
     * Find length of initial segment not matching mask
227
     *
228
     * @param string $mask
229
     * @param int $start
230
     * @param int $length
231
     *
232
     * @return int
233
     */
234 2 View Code Duplication
    public function cspn(string $mask, int $start = 0, int $length = null): int
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
235
    {
236 2
        if ($length === null) {
237 2
            $value = strcspn($this->value, $mask, $start);
238
        } else {
239 2
            $value = strcspn(
240 2
                $this->value,
241
                $mask,
242
                $start,
243
                $length
244
            );
245
        }
246
247 2
        return (int) $value;
248
    }
249
250
    /**
251
     * Repeat the string n times
252
     *
253
     * @param int $repeat
254
     *
255
     * @return self
256
     */
257 2
    public function repeat(int $repeat): self
258
    {
259 2
        return new self(str_repeat($this->value, $repeat));
260
    }
261
262
    /**
263
     * Shuffle the string
264
     *
265
     * @return self
266
     */
267 2
    public function shuffle(): self
268
    {
269 2
        return new self(str_shuffle($this->value));
270
    }
271
272
    /**
273
     * Strip slashes
274
     *
275
     * @return self
276
     */
277 2
    public function stripSlashes(): self
278
    {
279 2
        return new self(stripslashes($this->value));
280
    }
281
282
    /**
283
     * Strip C-like slashes
284
     *
285
     * @return self
286
     */
287 2
    public function stripCSlashes(): self
288
    {
289 2
        return new self(stripcslashes($this->value));
290
    }
291
292
    /**
293
     * Return the word count
294
     *
295
     * @param string $charlist
296
     *
297
     * @return int
298
     */
299 2
    public function wordCount(string $charlist = ''): int
300
    {
301 2
        return (int) str_word_count(
302 2
            $this->value,
303 2
            0,
304
            $charlist
305
        );
306
    }
307
308
    /**
309
     * Return the collection of words
310
     *
311
     * @param string $charlist
312
     *
313
     * @return MapInterface<int, self>
0 ignored issues
show
Documentation introduced by
The doc-type MapInterface<int, could not be parsed: Expected "|" or "end of type", but got "<" at position 12. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
314
     */
315 2
    public function words(string $charlist = ''): MapInterface
316
    {
317 2
        $words = str_word_count($this->value, 2, $charlist);
318 2
        $map = new Map('int', self::class);
319
320 2
        foreach ($words as $position => $word) {
321 2
            $map = $map->put($position, new self($word));
322
        }
323
324 2
        return $map;
325
    }
326
327
    /**
328
     * Split the string using a regular expression
329
     *
330
     * @param string $regex
331
     * @param int $limit
332
     *
333
     * @return StreamInterface<self>
0 ignored issues
show
Documentation introduced by
The doc-type StreamInterface<self> could not be parsed: Expected "|" or "end of type", but got "<" at position 15. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
334
     */
335 4 View Code Duplication
    public function pregSplit(string $regex, int $limit = -1): StreamInterface
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
336
    {
337 4
        $strings = preg_split($regex, $this->value, $limit);
338 4
        $stream = new Stream(self::class);
339
340 4
        foreach ($strings as $string) {
341 4
            $stream = $stream->add(new self($string));
1 ignored issue
show
Documentation introduced by
new self($string) is of type object<Innmind\Immutable\Str>, but the function expects a object<Innmind\Immutable\T>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
342
        }
343
344 4
        return $stream;
345
    }
346
347
    /**
348
     * Check if the string match the given regular expression
349
     *
350
     * @param string $regex
351
     * @param int $offset
352
     *
353
     * @throws Exception If the regex failed
354
     *
355
     * @return bool
356
     */
357 4 View Code Duplication
    public function matches(string $regex, int $offset = 0): bool
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
358
    {
359 4
        $matches = [];
360 4
        $value = preg_match($regex, $this->value, $matches, 0, $offset);
361
362 4
        if ($value === false) {
363 2
            throw new RegexException('', preg_last_error());
364
        }
365
366 2
        return (bool) $value;
367
    }
368
369
    /**
370
     * Return a collection of the elements matching the regex
371
     *
372
     * @param string $regex
373
     * @param int $offset
374
     * @param int $flags
375
     *
376
     * @throws Exception If the regex failed
377
     *
378
     * @return MapInterface<scalar, self>
0 ignored issues
show
Documentation introduced by
The doc-type MapInterface<scalar, could not be parsed: Expected "|" or "end of type", but got "<" at position 12. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
379
     */
380 4
    public function getMatches(
381
        string $regex,
382
        int $offset = 0,
383
        int $flags = self::PREG_NO_FLAGS
384
    ): MapInterface {
385 4
        $matches = [];
386 4
        $value = preg_match(
387
            $regex,
388 4
            $this->value,
389
            $matches,
390
            $flags,
391
            $offset
392
        );
393 4
        $map = new Map('scalar', self::class);
394
395 4
        foreach ($matches as $key => $match) {
396 2
            $map = $map->put($key, new self($match));
397
        }
398
399 4
        if ($value === false) {
400 2
            throw new RegexException('', preg_last_error());
401
        }
402
403 2
        return $map;
404
    }
405
406
    /**
407
     * Replace part of the string by using a regular expression
408
     *
409
     * @param string $regex
410
     * @param string $replacement
411
     * @param int $limit
412
     *
413
     * @throws Exception If the regex failed
414
     *
415
     * @return self
416
     */
417 2 View Code Duplication
    public function pregReplace(
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
418
        string $regex,
419
        string $replacement,
420
        int $limit = -1
421
    ): self {
422 2
        $value = preg_replace(
423
            $regex,
424
            $replacement,
425 2
            $this->value,
426
            $limit
427
        );
428
429 2
        if ($value === null) {
430
            throw new RegexException('', preg_last_error());
431
        }
432
433 2
        return new self($value);
434
    }
435
436
    /**
437
     * Return part of the string
438
     *
439
     * @param int $start
440
     * @param int $length
441
     *
442
     * @return self
443
     */
444 2 View Code Duplication
    public function substring(int $start, int $length = null): self
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
445
    {
446 2
        if ($length === null) {
447 2
            $sub = substr($this->value, $start);
448
        } else {
449 2
            $sub = substr($this->value, $start, $length);
450
        }
451
452 2
        return new self($sub);
453
    }
454
455
    /**
456
     * Return a formatted string
457
     *
458
     * @return self
459
     */
460 2
    public function sprintf(...$values): self
461
    {
462 2
        array_unshift($values, $this->value);
463 2
        $formatted = call_user_func_array('sprintf', $values);
464
465 2
        return new self($formatted);
466
    }
467
468
    /**
469
     * Return the string with the first letter as uppercase
470
     *
471
     * @return self
472
     */
473 4
    public function ucfirst(): self
474
    {
475 4
        return new self(ucfirst($this->value));
476
    }
477
478
    /**
479
     * Return the string with the first letter as lowercase
480
     *
481
     * @return self
482
     */
483 2
    public function lcfirst(): self
484
    {
485 2
        return new self(lcfirst($this->value));
486
    }
487
488
    /**
489
     * Return a CamelCase representation of the string
490
     *
491
     * @return self
492
     */
493 2
    public function camelize(): self
494
    {
495 2
        return new self(
496
            (string) $this
497 2
                ->pregSplit('/_| /')
498 2
                ->map(function(self $part) {
499 2
                    return $part->ucfirst();
500 2
                })
501 2
                ->join('')
502
        );
503
    }
504
505
    /**
506
     * Append a string at the end of the current one
507
     *
508
     * @param string $string
509
     *
510
     * @return self
511
     */
512 2
    public function append(string $string): self
513
    {
514 2
        return new self((string) $this.$string);
515
    }
516
517
    /**
518
     * Prepend a string at the beginning of the current one
519
     *
520
     * @param string $string
521
     *
522
     * @return self
523
     */
524 2
    public function prepend(string $string): self
525
    {
526 2
        return new self($string.(string) $this);
527
    }
528
529
    /**
530
     * Check if the 2 strings are equal
531
     *
532
     * @param self $string
533
     *
534
     * @return bool
535
     */
536 16
    public function equals(self $string): bool
537
    {
538 16
        return (string) $this === (string) $string;
539
    }
540
541
    /**
542
     * Trim the string
543
     *
544
     * @param string $mask
545
     *
546
     * @return self
547
     */
548 2
    public function trim(string $mask = null): self
549
    {
550 2
        return new self(
551 2
            $mask === null ? trim((string) $this) : trim((string) $this, $mask)
552
        );
553
    }
554
555
    /**
556
     * Trim the right side of the string
557
     *
558
     * @param string $mask
559
     *
560
     * @return self
561
     */
562 2
    public function rightTrim(string $mask = null): self
563
    {
564 2
        return new self(
565 2
            $mask === null ? rtrim((string) $this) : rtrim((string) $this, $mask)
566
        );
567
    }
568
569
    /**
570
     * Trim the left side of the string
571
     *
572
     * @param string $mask
573
     *
574
     * @return self
575
     */
576 2
    public function leftTrim(string $mask = null): self
577
    {
578 2
        return new self(
579 2
            $mask === null ? ltrim((string) $this) : ltrim((string) $this, $mask)
580
        );
581
    }
582
583
    /**
584
     * Check if the given string is present in the current one
585
     *
586
     * @param string $value
587
     *
588
     * @return bool
589
     */
590 2
    public function contains(string $value): bool
591
    {
592
        try {
593 2
            $this->position($value);
594
595 2
            return true;
596 2
        } catch (SubstringException $e) {
597 2
            return false;
598
        }
599
    }
600
601
    /**
602
     * Quote regular expression characters
603
     *
604
     * @param string $delimitier
0 ignored issues
show
Documentation introduced by
There is no parameter named $delimitier. Did you maybe mean $delimiter?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
605
     *
606
     * @return self
607
     */
608 2
    public function pregQuote(string $delimiter = ''): self
609
    {
610 2
        return new self(preg_quote((string) $this, $delimiter));
611
    }
612
613
    /**
614
     * Pad the string
615
     *
616
     * @param int $length
617
     * @param string $character
618
     * @param int $direction
619
     *
620
     * @return self
621
     */
622 2
    private function pad(
623
        int $length,
624
        string $character = ' ',
625
        int $direction = self::PAD_RIGHT
626
    ): self {
627 2
        return new self(str_pad(
628 2
            $this->value,
629
            $length,
630
            $character,
631
            $direction
632
        ));
633
    }
634
}
635