Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
98.97% |
96 / 97 |
|
87.50% |
7 / 8 |
CRAP | |
0.00% |
0 / 1 |
MatchOrMatch | |
98.97% |
96 / 97 |
|
87.50% |
7 / 8 |
12 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
__toString | |
100.00% |
17 / 17 |
|
100.00% |
1 / 1 |
1 | |||
getRegexStringLength | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
getMinimalPossibleLength | |
100.00% |
17 / 17 |
|
100.00% |
1 / 1 |
1 | |||
getMaximumPossibleLength | |
92.31% |
12 / 13 |
|
0.00% |
0 / 1 |
5.01 | |||
toCaseInsensitive | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
1 | |||
toDotAll | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
1 | |||
removeStartAndEndMarkers | |
100.00% |
18 / 18 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | namespace Apie\RegexTools\Parts; |
3 | |
4 | final class MatchOrMatch implements RegexPartInterface |
5 | { |
6 | /** |
7 | * @param array<int, RegexPartInterface> $part1 |
8 | * @param array<int, RegexPartInterface> $part2 |
9 | */ |
10 | public function __construct( |
11 | public readonly array $part1, |
12 | public readonly array $part2 |
13 | ) { |
14 | } |
15 | |
16 | public function __toString(): string |
17 | { |
18 | $callback = function (RegexPartInterface $part) { |
19 | return $part->__toString(); |
20 | }; |
21 | |
22 | return implode( |
23 | '', |
24 | array_map( |
25 | $callback, |
26 | $this->part1 |
27 | ) |
28 | ) . '|' |
29 | . implode( |
30 | '', |
31 | array_map( |
32 | $callback, |
33 | $this->part2 |
34 | ) |
35 | ); |
36 | } |
37 | |
38 | public function getRegexStringLength(): int |
39 | { |
40 | return array_reduce([...$this->part1, ...$this->part2], function (int $prevValue, RegexPartInterface $part) { |
41 | return $prevValue + $part->getRegexStringLength(); |
42 | }, 1); |
43 | } |
44 | |
45 | public function getMinimalPossibleLength(): int |
46 | { |
47 | $part1 = array_sum( |
48 | array_map( |
49 | function (RegexPartInterface $part) { |
50 | return $part->getMinimalPossibleLength(); |
51 | }, |
52 | $this->part1 |
53 | ) |
54 | ); |
55 | $part2 = array_sum( |
56 | array_map( |
57 | function (RegexPartInterface $part) { |
58 | return $part->getMinimalPossibleLength(); |
59 | }, |
60 | $this->part2 |
61 | ) |
62 | ); |
63 | return min($part1, $part2); |
64 | } |
65 | |
66 | public function getMaximumPossibleLength(): ?int |
67 | { |
68 | $sum1 = 0; |
69 | foreach ($this->part1 as $part) { |
70 | $max = $part->getMaximumPossibleLength(); |
71 | if ($max === null) { |
72 | return null; |
73 | } |
74 | $sum1 += $max; |
75 | } |
76 | $sum2 = 0; |
77 | foreach ($this->part2 as $part) { |
78 | $max = $part->getMaximumPossibleLength(); |
79 | if ($max === null) { |
80 | return null; |
81 | } |
82 | $sum2 += $max; |
83 | } |
84 | return max($sum1, $sum2); |
85 | } |
86 | |
87 | public function toCaseInsensitive(): RegexPartInterface |
88 | { |
89 | return new MatchOrMatch( |
90 | array_map( |
91 | function (RegexPartInterface $part) { |
92 | return $part->toCaseInsensitive(); |
93 | }, |
94 | $this->part1 |
95 | ), |
96 | array_map( |
97 | function (RegexPartInterface $part) { |
98 | return $part->toCaseInsensitive(); |
99 | }, |
100 | $this->part2 |
101 | ) |
102 | ); |
103 | } |
104 | |
105 | public function toDotAll(): RegexPartInterface |
106 | { |
107 | return new MatchOrMatch( |
108 | array_map( |
109 | function (RegexPartInterface $part) { |
110 | return $part->toDotAll(); |
111 | }, |
112 | $this->part1 |
113 | ), |
114 | array_map( |
115 | function (RegexPartInterface $part) { |
116 | return $part->toDotAll(); |
117 | }, |
118 | $this->part2 |
119 | ) |
120 | ); |
121 | } |
122 | |
123 | public function removeStartAndEndMarkers(): ?RegexPartInterface |
124 | { |
125 | return new MatchOrMatch( |
126 | array_filter( |
127 | array_map( |
128 | function (RegexPartInterface $part) { |
129 | return $part->removeStartAndEndMarkers(); |
130 | }, |
131 | $this->part1 |
132 | ) |
133 | ), |
134 | array_filter( |
135 | array_map( |
136 | function (RegexPartInterface $part) { |
137 | return $part->removeStartAndEndMarkers(); |
138 | }, |
139 | $this->part2 |
140 | ) |
141 | ) |
142 | ); |
143 | } |
144 | } |