Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * Zend Framework (http://framework.zend.com/)
|
Chris@0
|
4 *
|
Chris@0
|
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
|
Chris@0
|
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
7 * @license http://framework.zend.com/license/new-bsd New BSD License
|
Chris@0
|
8 */
|
Chris@0
|
9
|
Chris@0
|
10 namespace Zend\Feed;
|
Chris@0
|
11
|
Chris@0
|
12 class Uri
|
Chris@0
|
13 {
|
Chris@0
|
14 /**
|
Chris@0
|
15 * @var string
|
Chris@0
|
16 */
|
Chris@0
|
17 protected $fragment;
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * @var string
|
Chris@0
|
21 */
|
Chris@0
|
22 protected $host;
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * @var string
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $pass;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * @var string
|
Chris@0
|
31 */
|
Chris@0
|
32 protected $path;
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * @var int
|
Chris@0
|
36 */
|
Chris@0
|
37 protected $port;
|
Chris@0
|
38
|
Chris@0
|
39 /**
|
Chris@0
|
40 * @var string
|
Chris@0
|
41 */
|
Chris@0
|
42 protected $query;
|
Chris@0
|
43
|
Chris@0
|
44 /**
|
Chris@0
|
45 * @var string
|
Chris@0
|
46 */
|
Chris@0
|
47 protected $scheme;
|
Chris@0
|
48
|
Chris@0
|
49 /**
|
Chris@0
|
50 * @var string
|
Chris@0
|
51 */
|
Chris@0
|
52 protected $user;
|
Chris@0
|
53
|
Chris@0
|
54 /**
|
Chris@0
|
55 * @var bool
|
Chris@0
|
56 */
|
Chris@0
|
57 protected $valid;
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * Valid schemes
|
Chris@0
|
61 */
|
Chris@0
|
62 protected $validSchemes = [
|
Chris@0
|
63 'http',
|
Chris@0
|
64 'https',
|
Chris@0
|
65 'file',
|
Chris@0
|
66 ];
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * @param string $uri
|
Chris@0
|
70 */
|
Chris@0
|
71 public function __construct($uri)
|
Chris@0
|
72 {
|
Chris@0
|
73 $parsed = parse_url($uri);
|
Chris@0
|
74 if (false === $parsed) {
|
Chris@0
|
75 $this->valid = false;
|
Chris@0
|
76 return;
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@12
|
79 $this->scheme = isset($parsed['scheme']) ? $parsed['scheme'] : null;
|
Chris@12
|
80 $this->host = isset($parsed['host']) ? $parsed['host'] : null;
|
Chris@12
|
81 $this->port = isset($parsed['port']) ? $parsed['port'] : null;
|
Chris@12
|
82 $this->user = isset($parsed['user']) ? $parsed['user'] : null;
|
Chris@12
|
83 $this->pass = isset($parsed['pass']) ? $parsed['pass'] : null;
|
Chris@12
|
84 $this->path = isset($parsed['path']) ? $parsed['path'] : null;
|
Chris@12
|
85 $this->query = isset($parsed['query']) ? $parsed['query'] : null;
|
Chris@0
|
86 $this->fragment = isset($parsed['fragment']) ? $parsed['fragment'] : null;
|
Chris@0
|
87 }
|
Chris@0
|
88
|
Chris@0
|
89 /**
|
Chris@0
|
90 * Create an instance
|
Chris@0
|
91 *
|
Chris@0
|
92 * Useful for chained validations
|
Chris@0
|
93 *
|
Chris@0
|
94 * @param string $uri
|
Chris@0
|
95 * @return self
|
Chris@0
|
96 */
|
Chris@0
|
97 public static function factory($uri)
|
Chris@0
|
98 {
|
Chris@0
|
99 return new static($uri);
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * Retrieve the host
|
Chris@0
|
104 *
|
Chris@0
|
105 * @return string
|
Chris@0
|
106 */
|
Chris@0
|
107 public function getHost()
|
Chris@0
|
108 {
|
Chris@0
|
109 return $this->host;
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 /**
|
Chris@0
|
113 * Retrieve the URI path
|
Chris@0
|
114 *
|
Chris@0
|
115 * @return string
|
Chris@0
|
116 */
|
Chris@0
|
117 public function getPath()
|
Chris@0
|
118 {
|
Chris@0
|
119 return $this->path;
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * Retrieve the scheme
|
Chris@0
|
124 *
|
Chris@0
|
125 * @return string
|
Chris@0
|
126 */
|
Chris@0
|
127 public function getScheme()
|
Chris@0
|
128 {
|
Chris@0
|
129 return $this->scheme;
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 /**
|
Chris@0
|
133 * Is the URI valid?
|
Chris@0
|
134 *
|
Chris@0
|
135 * @return bool
|
Chris@0
|
136 */
|
Chris@0
|
137 public function isValid()
|
Chris@0
|
138 {
|
Chris@0
|
139 if (false === $this->valid) {
|
Chris@0
|
140 return false;
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@12
|
143 if ($this->scheme && ! in_array($this->scheme, $this->validSchemes)) {
|
Chris@0
|
144 return false;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 if ($this->host) {
|
Chris@17
|
148 if ($this->path && 0 !== strpos($this->path, '/')) {
|
Chris@0
|
149 return false;
|
Chris@0
|
150 }
|
Chris@0
|
151 return true;
|
Chris@0
|
152 }
|
Chris@0
|
153
|
Chris@0
|
154 // no host, but user and/or port... what?
|
Chris@0
|
155 if ($this->user || $this->port) {
|
Chris@0
|
156 return false;
|
Chris@0
|
157 }
|
Chris@0
|
158
|
Chris@0
|
159 if ($this->path) {
|
Chris@0
|
160 // Check path-only (no host) URI
|
Chris@17
|
161 if (0 === strpos($this->path, '//')) {
|
Chris@0
|
162 return false;
|
Chris@0
|
163 }
|
Chris@0
|
164 return true;
|
Chris@0
|
165 }
|
Chris@0
|
166
|
Chris@0
|
167 if (! ($this->query || $this->fragment)) {
|
Chris@0
|
168 // No host, path, query or fragment - this is not a valid URI
|
Chris@0
|
169 return false;
|
Chris@0
|
170 }
|
Chris@0
|
171
|
Chris@0
|
172 return true;
|
Chris@0
|
173 }
|
Chris@0
|
174
|
Chris@0
|
175 /**
|
Chris@0
|
176 * Is the URI absolute?
|
Chris@0
|
177 *
|
Chris@0
|
178 * @return bool
|
Chris@0
|
179 */
|
Chris@0
|
180 public function isAbsolute()
|
Chris@0
|
181 {
|
Chris@0
|
182 return ($this->scheme !== null);
|
Chris@0
|
183 }
|
Chris@0
|
184 }
|