Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 112
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ChainManipulator
0.00% covered (danger)
0.00%
0 / 112
0.00% covered (danger)
0.00%
0 / 3
210
0.00% covered (danger)
0.00%
0 / 1
 removeAllNonAlphaNumericChar
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
110
 removeAccents
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 1
6
 extractUuidFromString
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Domain\Tools;
4
5class ChainManipulator
6{
7    public static function removeAllNonAlphaNumericChar(string $chain, string $replacingChar = '_')
8    {
9        $asciiFilename = '';
10        $encoding      = mb_detect_encoding($chain, null, true) ?: '8bit';
11
12        for ($i = 0, $filenameLength = mb_strlen($chain, $encoding); $i < $filenameLength; ++$i) {
13            $char = mb_substr($chain, $i, 1, $encoding);
14
15            // remove all character is not alphanumeric base on ascii table
16            // ascii table https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
17            if ((\ord($char) < 48 || \ord($char) > 57)
18                && (\ord($char) < 65 || \ord($char) > 90)
19                && (\ord($char) < 97 || \ord($char) > 123)
20            ) {
21                if ($replacingChar !== substr($asciiFilename, -1)) {
22                    $asciiFilename .= $replacingChar;
23                }
24            } else {
25                $asciiFilename .= $char;
26            }
27        }
28
29        return $asciiFilename;
30    }
31
32    public static function removeAccents($string)
33    {
34        if (!preg_match('/[\x80-\xff]/', $string)) {
35            return $string;
36        }
37        $chars = [
38            // Decompositions for Latin-1 Supplement
39            chr(195) . chr(128) => 'A', chr(195) . chr(129) => 'A',
40            chr(195) . chr(130) => 'A', chr(195) . chr(131) => 'A',
41            chr(195) . chr(132) => 'A', chr(195) . chr(133) => 'A',
42            chr(195) . chr(135) => 'C', chr(195) . chr(136) => 'E',
43            chr(195) . chr(137) => 'E', chr(195) . chr(138) => 'E',
44            chr(195) . chr(139) => 'E', chr(195) . chr(140) => 'I',
45            chr(195) . chr(141) => 'I', chr(195) . chr(142) => 'I',
46            chr(195) . chr(143) => 'I', chr(195) . chr(145) => 'N',
47            chr(195) . chr(146) => 'O', chr(195) . chr(147) => 'O',
48            chr(195) . chr(148) => 'O', chr(195) . chr(149) => 'O',
49            chr(195) . chr(150) => 'O', chr(195) . chr(153) => 'U',
50            chr(195) . chr(154) => 'U', chr(195) . chr(155) => 'U',
51            chr(195) . chr(156) => 'U', chr(195) . chr(157) => 'Y',
52            chr(195) . chr(159) => 's', chr(195) . chr(160) => 'a',
53            chr(195) . chr(161) => 'a', chr(195) . chr(162) => 'a',
54            chr(195) . chr(163) => 'a', chr(195) . chr(164) => 'a',
55            chr(195) . chr(165) => 'a', chr(195) . chr(167) => 'c',
56            chr(195) . chr(168) => 'e', chr(195) . chr(169) => 'e',
57            chr(195) . chr(170) => 'e', chr(195) . chr(171) => 'e',
58            chr(195) . chr(172) => 'i', chr(195) . chr(173) => 'i',
59            chr(195) . chr(174) => 'i', chr(195) . chr(175) => 'i',
60            chr(195) . chr(177) => 'n', chr(195) . chr(178) => 'o',
61            chr(195) . chr(179) => 'o', chr(195) . chr(180) => 'o',
62            chr(195) . chr(181) => 'o', chr(195) . chr(182) => 'o',
63            chr(195) . chr(182) => 'o', chr(195) . chr(185) => 'u',
64            chr(195) . chr(186) => 'u', chr(195) . chr(187) => 'u',
65            chr(195) . chr(188) => 'u', chr(195) . chr(189) => 'y',
66            chr(195) . chr(191) => 'y',
67            // Decompositions for Latin Extended-A
68            chr(196) . chr(128) => 'A', chr(196) . chr(129) => 'a',
69            chr(196) . chr(130) => 'A', chr(196) . chr(131) => 'a',
70            chr(196) . chr(132) => 'A', chr(196) . chr(133) => 'a',
71            chr(196) . chr(134) => 'C', chr(196) . chr(135) => 'c',
72            chr(196) . chr(136) => 'C', chr(196) . chr(137) => 'c',
73            chr(196) . chr(138) => 'C', chr(196) . chr(139) => 'c',
74            chr(196) . chr(140) => 'C', chr(196) . chr(141) => 'c',
75            chr(196) . chr(142) => 'D', chr(196) . chr(143) => 'd',
76            chr(196) . chr(144) => 'D', chr(196) . chr(145) => 'd',
77            chr(196) . chr(146) => 'E', chr(196) . chr(147) => 'e',
78            chr(196) . chr(148) => 'E', chr(196) . chr(149) => 'e',
79            chr(196) . chr(150) => 'E', chr(196) . chr(151) => 'e',
80            chr(196) . chr(152) => 'E', chr(196) . chr(153) => 'e',
81            chr(196) . chr(154) => 'E', chr(196) . chr(155) => 'e',
82            chr(196) . chr(156) => 'G', chr(196) . chr(157) => 'g',
83            chr(196) . chr(158) => 'G', chr(196) . chr(159) => 'g',
84            chr(196) . chr(160) => 'G', chr(196) . chr(161) => 'g',
85            chr(196) . chr(162) => 'G', chr(196) . chr(163) => 'g',
86            chr(196) . chr(164) => 'H', chr(196) . chr(165) => 'h',
87            chr(196) . chr(166) => 'H', chr(196) . chr(167) => 'h',
88            chr(196) . chr(168) => 'I', chr(196) . chr(169) => 'i',
89            chr(196) . chr(170) => 'I', chr(196) . chr(171) => 'i',
90            chr(196) . chr(172) => 'I', chr(196) . chr(173) => 'i',
91            chr(196) . chr(174) => 'I', chr(196) . chr(175) => 'i',
92            chr(196) . chr(176) => 'I', chr(196) . chr(177) => 'i',
93            chr(196) . chr(178) => 'IJ', chr(196) . chr(179) => 'ij',
94            chr(196) . chr(180) => 'J', chr(196) . chr(181) => 'j',
95            chr(196) . chr(182) => 'K', chr(196) . chr(183) => 'k',
96            chr(196) . chr(184) => 'k', chr(196) . chr(185) => 'L',
97            chr(196) . chr(186) => 'l', chr(196) . chr(187) => 'L',
98            chr(196) . chr(188) => 'l', chr(196) . chr(189) => 'L',
99            chr(196) . chr(190) => 'l', chr(196) . chr(191) => 'L',
100            chr(197) . chr(128) => 'l', chr(197) . chr(129) => 'L',
101            chr(197) . chr(130) => 'l', chr(197) . chr(131) => 'N',
102            chr(197) . chr(132) => 'n', chr(197) . chr(133) => 'N',
103            chr(197) . chr(134) => 'n', chr(197) . chr(135) => 'N',
104            chr(197) . chr(136) => 'n', chr(197) . chr(137) => 'N',
105            chr(197) . chr(138) => 'n', chr(197) . chr(139) => 'N',
106            chr(197) . chr(140) => 'O', chr(197) . chr(141) => 'o',
107            chr(197) . chr(142) => 'O', chr(197) . chr(143) => 'o',
108            chr(197) . chr(144) => 'O', chr(197) . chr(145) => 'o',
109            chr(197) . chr(146) => 'OE', chr(197) . chr(147) => 'oe',
110            chr(197) . chr(148) => 'R', chr(197) . chr(149) => 'r',
111            chr(197) . chr(150) => 'R', chr(197) . chr(151) => 'r',
112            chr(197) . chr(152) => 'R', chr(197) . chr(153) => 'r',
113            chr(197) . chr(154) => 'S', chr(197) . chr(155) => 's',
114            chr(197) . chr(156) => 'S', chr(197) . chr(157) => 's',
115            chr(197) . chr(158) => 'S', chr(197) . chr(159) => 's',
116            chr(197) . chr(160) => 'S', chr(197) . chr(161) => 's',
117            chr(197) . chr(162) => 'T', chr(197) . chr(163) => 't',
118            chr(197) . chr(164) => 'T', chr(197) . chr(165) => 't',
119            chr(197) . chr(166) => 'T', chr(197) . chr(167) => 't',
120            chr(197) . chr(168) => 'U', chr(197) . chr(169) => 'u',
121            chr(197) . chr(170) => 'U', chr(197) . chr(171) => 'u',
122            chr(197) . chr(172) => 'U', chr(197) . chr(173) => 'u',
123            chr(197) . chr(174) => 'U', chr(197) . chr(175) => 'u',
124            chr(197) . chr(176) => 'U', chr(197) . chr(177) => 'u',
125            chr(197) . chr(178) => 'U', chr(197) . chr(179) => 'u',
126            chr(197) . chr(180) => 'W', chr(197) . chr(181) => 'w',
127            chr(197) . chr(182) => 'Y', chr(197) . chr(183) => 'y',
128            chr(197) . chr(184) => 'Y', chr(197) . chr(185) => 'Z',
129            chr(197) . chr(186) => 'z', chr(197) . chr(187) => 'Z',
130            chr(197) . chr(188) => 'z', chr(197) . chr(189) => 'Z',
131            chr(197) . chr(190) => 'z', chr(197) . chr(191) => 's',
132        ];
133
134        $string = strtr($string, $chars);
135
136        return $string;
137    }
138
139    public static function extractUuidFromString(?string $string)
140    {
141        $res = [];
142        preg_match('/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/', $string, $res);
143
144        return empty($res) ? null : $res[0];
145    }
146}