Completed
Push — master ( a2d719...4531d5 )
by Radu
07:41
created

RequestHelper::explode()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
c 0
b 0
f 0
dl 0
loc 10
rs 10
cc 3
nc 3
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace WebServCo\Framework\Helpers;
6
7
final class RequestHelper
8
{
9
    /**
10
    * @return array<int,string>
11
    */
12
    public static function explode(string $string): array
13
    {
14
        if (false !== \strpos($string, '?')) {
15
            return \explode('?', $string, 2);
16
        }
17
18
        if (false !== \strpos($string, '&')) {
19
            return \explode('&', $string, 2);
20
        }
21
        return [$string, ''];
22
    }
23
24
    /**
25
    * @return array<string, string|null>
26
    */
27
    public static function format(string $string): array
28
    {
29
        $data = [];
30
        $parts = self::split($string);
31
        $num = \count($parts);
32
        for ($position = 0; $position < $num; $position += 2) {
33
            $data[$parts[$position]] = $position === $num - 1
34
                ? null
35
                :
36
            $parts[$position + 1];
37
        }
38
        return $data;
39
    }
40
41
    public static function getRemoteAddress(): string
42
    {
43
        if (PhpHelper::isCli()) {
44
            return \gethostbyname(\php_uname('n'));
45
        }
46
47
        if (\array_key_exists('REMOTE_ADDR', $_SERVER)) {
48
            return \WebServCo\Framework\Helpers\RequestHelper::sanitizeString($_SERVER['REMOTE_ADDR']);
49
        }
50
51
        return '';
52
    }
53
54
    /**
55
    * @param array<int,string> $suffixes
56
    * @return array<int,string>
57
    */
58
    public static function parse(string $string, string $path, string $filename, array $suffixes): array
59
    {
60
        $pathLen = \strlen($path);
61
        if (0 === \strncasecmp($path, $string, $pathLen)) {
62
            $string = \substr($string, $pathLen);
63
        }
64
        $filenameLen = \strlen($filename);
65
        if (0 === \strncasecmp($filename, $string, $filenameLen)) {
66
            $string = \substr($string, $filenameLen);
67
        }
68
        [$target, $query] = self::explode($string);
69
        [$target, $suffix] = self::removeSuffix(
70
            self::transform($target),
71
            $suffixes,
72
        );
73
        $query = self::transform($query);
74
        return [$target, $query, $suffix];
75
    }
76
77
    /**
78
    * @param array<int,string> $suffixes
79
    * @return array<int,string>
80
    */
81
    public static function removeSuffix(string $string, array $suffixes = []): array
82
    {
83
        if ($suffixes) {
84
            $stringRev = \strrev($string);
85
            foreach ($suffixes as $suffix) {
86
                $suffixRev = \strrev($suffix);
87
                $suffixLen = \strlen($suffix);
88
                if (0 === \strncasecmp($suffixRev, $stringRev, $suffixLen)) {
89
                    return [\strrev(\substr($stringRev, $suffixLen)), $suffix];
90
                }
91
            }
92
        }
93
        return [$string, ''];
94
    }
95
96
    public static function sanitizeString(string $string): string
97
    {
98
        // Strip tags, optionally strip or encode special characters.
99
        $string = \filter_var($string, \FILTER_SANITIZE_STRING);
100
        $unwanted = [
101
            "`",
102
            //"'",
103
            //'"',
104
            "\b",
105
            "\n",
106
            "\r",
107
            "\t",
108
            //"?",
109
            //"!",
110
            //"~",
111
            //"#",
112
            //"^",
113
            //"&",
114
            //"*",
115
            //"=",
116
            //"[",
117
            //"]",
118
            //":",
119
            //";",
120
            //",",
121
            //"|",
122
            "\\",
123
            //"{",
124
            //"}",
125
            //"(",
126
            //")",
127
            "\$",
128
        ];
129
        $string = \str_replace($unwanted, '', (string) $string);
130
        return $string;
131
    }
132
133
    /**
134
    * @return array<int,string>
135
    */
136
    public static function split(string $string): array
137
    {
138
        $parts = \explode('/', $string);
139
        $parts = \array_map('urldecode', $parts);
140
        return \array_diff($parts, ['']);
141
    }
142
143
    public static function transform(string $string): string
144
    {
145
        $string = \str_replace(['?', '&', '=', '//'], ['', '/', '/', '/0/'], $string);
146
        return \trim($string, ' /');
147
    }
148
}
149