-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathURL.php
More file actions
113 lines (97 loc) · 2.35 KB
/
URL.php
File metadata and controls
113 lines (97 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
namespace Utopia\Validator;
use Utopia\Validator;
use Utopia\Validator\URL\Pattern;
/**
* URL
*
* Validate that an variable is a valid URL
*
* @package Appwrite\Network\Validator
*/
class URL extends Validator
{
/**
* @var array<Pattern>
*/
protected array $patterns;
/**
* @param array<Pattern> $patterns
*/
public function __construct(array $patterns = [])
{
$this->patterns = $patterns;
}
/**
* Get Description
*
* Returns validator description
*
* @return string
*/
public function getDescription(): string
{
if (!empty($this->patterns)) {
return 'Value must be a valid URL matching one of the following patterns (' . \implode(', ', $this->patterns) . ')';
}
return 'Value must be a valid URL';
}
/**
* Is valid
*
* Validation will pass when $value is valid URL.
*
* @param mixed $value
* @return bool
*/
public function isValid($value): bool
{
$parsed = $this->parseUrl($value);
if (!$parsed) {
return false;
}
if (empty($this->patterns)) {
return true;
}
foreach ($this->patterns as $pattern) {
$schemeMatch = empty($pattern->schemes) || in_array($parsed['scheme'], $pattern->schemes);
$hostMatch = empty($pattern->hosts) || in_array($parsed['host'], $pattern->hosts);
if ($schemeMatch && $hostMatch) {
return true;
}
}
return false;
}
protected function parseUrl($value): mixed
{
$parsed = \parse_url($value);
// `parse_url` returns false if the URL is invalid, and when hostname is missing.
// In this case, try to extract the scheme using regex.
if (!$parsed && $matches = \preg_match('/^([a-z]+):\/\//', $value, $matches)) {
$parsed = ['scheme' => $matches[1] ?? ''];
}
return $parsed;
}
/**
* Is array
*
* Function will return true if object is array.
*
* @return bool
*/
public function isArray(): bool
{
return false;
}
/**
* Get Type
*
* Returns validator type.
*
* @return string
*/
public function getType(): string
{
return self::TYPE_STRING;
}
}