|
1
|
|
|
<?php |
|
2
|
|
|
/* Source: https://github.com/moodle/moodle/blob/MOODLE_310_STABLE/lib/validateurlsyntax.php under GNU/GPL license */ |
|
3
|
|
|
|
|
4
|
|
|
/** |
|
5
|
|
|
* BEGINNING OF validateUrlSyntax() function. |
|
6
|
|
|
*/ |
|
7
|
|
|
function validateUrlSyntax($urladdr, $options = "") |
|
8
|
|
|
{ |
|
9
|
|
|
// Force Options parameter to be lower case |
|
10
|
|
|
// DISABLED PERMAMENTLY - OK to remove from code |
|
11
|
|
|
// $options = strtolower($options); |
|
12
|
|
|
|
|
13
|
|
|
// Check Options Parameter |
|
14
|
|
|
if (!preg_match('/^([sHSEFRuPaIpfqr][+?-])*$/', $options)) { |
|
15
|
|
|
trigger_error("Options attribute malformed", E_USER_ERROR); |
|
16
|
|
|
} |
|
17
|
|
|
|
|
18
|
|
|
// Set Options Array, set defaults if options are not specified |
|
19
|
|
|
// Scheme |
|
20
|
|
|
if (strpos($options, 's') === false) { |
|
21
|
|
|
$aOptions['s'] = '?'; |
|
|
|
|
|
|
22
|
|
|
} else { |
|
23
|
|
|
$aOptions['s'] = substr($options, strpos($options, 's') + 1, 1); |
|
24
|
|
|
} |
|
25
|
|
|
// http:// |
|
26
|
|
|
if (strpos($options, 'H') === false) { |
|
27
|
|
|
$aOptions['H'] = '?'; |
|
28
|
|
|
} else { |
|
29
|
|
|
$aOptions['H'] = substr($options, strpos($options, 'H') + 1, 1); |
|
30
|
|
|
} |
|
31
|
|
|
// https:// (SSL) |
|
32
|
|
|
if (strpos($options, 'S') === false) { |
|
33
|
|
|
$aOptions['S'] = '?'; |
|
34
|
|
|
} else { |
|
35
|
|
|
$aOptions['S'] = substr($options, strpos($options, 'S') + 1, 1); |
|
36
|
|
|
} |
|
37
|
|
|
// mailto: (email) |
|
38
|
|
|
if (strpos($options, 'E') === false) { |
|
39
|
|
|
$aOptions['E'] = '-'; |
|
40
|
|
|
} else { |
|
41
|
|
|
$aOptions['E'] = substr($options, strpos($options, 'E') + 1, 1); |
|
42
|
|
|
} |
|
43
|
|
|
// ftp:// |
|
44
|
|
|
if (strpos($options, 'F') === false) { |
|
45
|
|
|
$aOptions['F'] = '-'; |
|
46
|
|
|
} else { |
|
47
|
|
|
$aOptions['F'] = substr($options, strpos($options, 'F') + 1, 1); |
|
48
|
|
|
} |
|
49
|
|
|
// rtmp:// |
|
50
|
|
|
if (strpos($options, 'R') === false) { |
|
51
|
|
|
$aOptions['R'] = '-'; |
|
52
|
|
|
} else { |
|
53
|
|
|
$aOptions['R'] = substr($options, strpos($options, 'R') + 1, 1); |
|
54
|
|
|
} |
|
55
|
|
|
// User section |
|
56
|
|
|
if (strpos($options, 'u') === false) { |
|
57
|
|
|
$aOptions['u'] = '?'; |
|
58
|
|
|
} else { |
|
59
|
|
|
$aOptions['u'] = substr($options, strpos($options, 'u') + 1, 1); |
|
60
|
|
|
} |
|
61
|
|
|
// Password in user section |
|
62
|
|
|
if (strpos($options, 'P') === false) { |
|
63
|
|
|
$aOptions['P'] = '?'; |
|
64
|
|
|
} else { |
|
65
|
|
|
$aOptions['P'] = substr($options, strpos($options, 'P') + 1, 1); |
|
66
|
|
|
} |
|
67
|
|
|
// Address Section |
|
68
|
|
|
if (strpos($options, 'a') === false) { |
|
69
|
|
|
$aOptions['a'] = '+'; |
|
70
|
|
|
} else { |
|
71
|
|
|
$aOptions['a'] = substr($options, strpos($options, 'a') + 1, 1); |
|
72
|
|
|
} |
|
73
|
|
|
// IP Address in address section |
|
74
|
|
|
if (strpos($options, 'I') === false) { |
|
75
|
|
|
$aOptions['I'] = '?'; |
|
76
|
|
|
} else { |
|
77
|
|
|
$aOptions['I'] = substr($options, strpos($options, 'I') + 1, 1); |
|
78
|
|
|
} |
|
79
|
|
|
// Port number |
|
80
|
|
|
if (strpos($options, 'p') === false) { |
|
81
|
|
|
$aOptions['p'] = '?'; |
|
82
|
|
|
} else { |
|
83
|
|
|
$aOptions['p'] = substr($options, strpos($options, 'p') + 1, 1); |
|
84
|
|
|
} |
|
85
|
|
|
// File Path |
|
86
|
|
|
if (strpos($options, 'f') === false) { |
|
87
|
|
|
$aOptions['f'] = '?'; |
|
88
|
|
|
} else { |
|
89
|
|
|
$aOptions['f'] = substr($options, strpos($options, 'f') + 1, 1); |
|
90
|
|
|
} |
|
91
|
|
|
// Query Section |
|
92
|
|
|
if (strpos($options, 'q') === false) { |
|
93
|
|
|
$aOptions['q'] = '?'; |
|
94
|
|
|
} else { |
|
95
|
|
|
$aOptions['q'] = substr($options, strpos($options, 'q') + 1, 1); |
|
96
|
|
|
} |
|
97
|
|
|
// Fragment (Anchor) |
|
98
|
|
|
if (strpos($options, 'r') === false) { |
|
99
|
|
|
$aOptions['r'] = '?'; |
|
100
|
|
|
} else { |
|
101
|
|
|
$aOptions['r'] = substr($options, strpos($options, 'r') + 1, 1); |
|
102
|
|
|
} |
|
103
|
|
|
|
|
104
|
|
|
// Loop through options array, to search for and replace "-" to "{0}" and "+" to "" |
|
105
|
|
|
foreach ($aOptions as $key => $value) { |
|
106
|
|
|
if ($value == '-') { |
|
107
|
|
|
$aOptions[$key] = '{0}'; |
|
108
|
|
|
} |
|
109
|
|
|
if ($value == '+') { |
|
110
|
|
|
$aOptions[$key] = ''; |
|
111
|
|
|
} |
|
112
|
|
|
} |
|
113
|
|
|
|
|
114
|
|
|
// DEBUGGING - Unescape following line to display to screen current option values |
|
115
|
|
|
// echo '<pre>'; print_r($aOptions); echo '</pre>'; |
|
116
|
|
|
|
|
117
|
|
|
// Preset Allowed Characters |
|
118
|
|
|
$alphanum = '[a-zA-Z0-9]'; // Alpha Numeric |
|
119
|
|
|
$unreserved = '[a-zA-Z0-9_.!~*'.'\''.'()-]'; |
|
120
|
|
|
$escaped = '(%[0-9a-fA-F]{2})'; // Escape sequence - In Hex - %6d would be a 'm' |
|
121
|
|
|
$reserved = '[;/?:@&=+$,]'; // Special characters in the URI |
|
122
|
|
|
|
|
123
|
|
|
// Beginning Regular Expression |
|
124
|
|
|
// Scheme - Allows for 'http://', 'https://', 'mailto:', 'ftp://' or 'rtmp://' |
|
125
|
|
|
$scheme = '('; |
|
126
|
|
|
if ($aOptions['H'] === '') { |
|
127
|
|
|
$scheme .= 'http://'; |
|
128
|
|
|
} elseif ($aOptions['S'] === '') { |
|
129
|
|
|
$scheme .= 'https://'; |
|
130
|
|
|
} elseif ($aOptions['E'] === '') { |
|
131
|
|
|
$scheme .= 'mailto:'; |
|
132
|
|
|
} elseif ($aOptions['F'] === '') { |
|
133
|
|
|
$scheme .= 'ftp://'; |
|
134
|
|
|
} elseif ($aOptions['R'] === '') { |
|
135
|
|
|
$scheme .= 'rtmp://'; |
|
136
|
|
|
} else { |
|
137
|
|
|
if ($aOptions['H'] === '?') { |
|
138
|
|
|
$scheme .= '|(http://)'; |
|
139
|
|
|
} |
|
140
|
|
|
if ($aOptions['S'] === '?') { |
|
141
|
|
|
$scheme .= '|(https://)'; |
|
142
|
|
|
} |
|
143
|
|
|
if ($aOptions['E'] === '?') { |
|
144
|
|
|
$scheme .= '|(mailto:)'; |
|
145
|
|
|
} |
|
146
|
|
|
if ($aOptions['F'] === '?') { |
|
147
|
|
|
$scheme .= '|(ftp://)'; |
|
148
|
|
|
} |
|
149
|
|
|
if ($aOptions['R'] === '?') { |
|
150
|
|
|
$scheme .= '|(rtmp://)'; |
|
151
|
|
|
} |
|
152
|
|
|
$scheme = str_replace('(|', '(', $scheme); // fix first pipe |
|
153
|
|
|
} |
|
154
|
|
|
$scheme .= ')'.$aOptions['s']; |
|
155
|
|
|
// End setting scheme |
|
156
|
|
|
|
|
157
|
|
|
// User Info - Allows for 'username@' or 'username:password@'. Note: contrary to rfc, I removed ':' from username section, allowing it only in password. |
|
158
|
|
|
// /---------------- Username -----------------------\ /-------------------------------- Password ------------------------------\ |
|
159
|
|
|
$userinfo = '(('.$unreserved.'|'.$escaped.'|[;&=+$,]'.')+(:('.$unreserved.'|'.$escaped.'|[;:&=+$,]'.')+)'.$aOptions['P'].'@)'.$aOptions['u']; |
|
160
|
|
|
|
|
161
|
|
|
// IP ADDRESS - Allows 0.0.0.0 to 255.255.255.255 |
|
162
|
|
|
$ipaddress = '((((2(([0-4][0-9])|(5[0-5])))|([01]?[0-9]?[0-9]))\.){3}((2(([0-4][0-9])|(5[0-5])))|([01]?[0-9]?[0-9])))'; |
|
163
|
|
|
|
|
164
|
|
|
// Tertiary Domain(s) - Optional - Multi - Although some sites may use other characters, the RFC says tertiary domains have the same naming restrictions as second level domains |
|
165
|
|
|
$domain_tertiary = '('.$alphanum.'(([a-zA-Z0-9-]{0,62})'.$alphanum.')?\.)*'; |
|
166
|
|
|
$domain_toplevel = '([a-zA-Z](([a-zA-Z0-9-]*)[a-zA-Z0-9])?)'; |
|
167
|
|
|
|
|
168
|
|
|
if ($aOptions['I'] === '{0}') { // IP Address Not Allowed |
|
169
|
|
|
$address = '('.$domain_tertiary. /* MDL-9295 $domain_secondary . */ $domain_toplevel.')'; |
|
170
|
|
|
} elseif ($aOptions['I'] === '') { // IP Address Required |
|
171
|
|
|
$address = '('.$ipaddress.')'; |
|
172
|
|
|
} else { // IP Address Optional |
|
173
|
|
|
$address = '(('.$ipaddress.')|('.$domain_tertiary. /* MDL-9295 $domain_secondary . */ $domain_toplevel.'))'; |
|
174
|
|
|
} |
|
175
|
|
|
$address = $address.$aOptions['a']; |
|
176
|
|
|
|
|
177
|
|
|
// Port Number - :80 or :8080 or :65534 Allows range of :0 to :65535 |
|
178
|
|
|
// (0-59999) |(60000-64999) |(65000-65499) |(65500-65529) |(65530-65535) |
|
179
|
|
|
$port_number = '(:(([0-5]?[0-9]{1,4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5])))'.$aOptions['p']; |
|
180
|
|
|
|
|
181
|
|
|
// Path - Can be as simple as '/' or have multiple folders and filenames |
|
182
|
|
|
$path = '(/((;)?('.$unreserved.'|'.$escaped.'|'.'[:@&=+$,]'.')+(/)?)*)'.$aOptions['f']; |
|
183
|
|
|
|
|
184
|
|
|
// Query Section - Accepts ?var1=value1&var2=value2 or ?2393,1221 and much more |
|
185
|
|
|
$querystring = '(\?('.$reserved.'|'.$unreserved.'|'.$escaped.')*)'.$aOptions['q']; |
|
186
|
|
|
|
|
187
|
|
|
// Fragment Section - Accepts anchors such as #top |
|
188
|
|
|
$fragment = '(\#('.$reserved.'|'.$unreserved.'|'.$escaped.')*)'.$aOptions['r']; |
|
189
|
|
|
|
|
190
|
|
|
// Building Regular Expression |
|
191
|
|
|
$regexp = '#^'.$scheme.$userinfo.$address.$port_number.$path.$querystring.$fragment.'$#i'; |
|
192
|
|
|
|
|
193
|
|
|
// DEBUGGING - Uncomment Line Below To Display The Regular Expression Built |
|
194
|
|
|
// echo '<pre>' . htmlentities(wordwrap($regexp,70,"\n",1)) . '</pre>'; |
|
195
|
|
|
|
|
196
|
|
|
// Running the regular expression |
|
197
|
|
|
if (preg_match($regexp, $urladdr)) { |
|
198
|
|
|
return true; // The domain passed |
|
199
|
|
|
} else { |
|
200
|
|
|
return false; // The domain didn't pass the expression |
|
201
|
|
|
} |
|
202
|
|
|
} // END Function validateUrlSyntax() |
|
203
|
|
|
|
|
204
|
|
|
/** |
|
205
|
|
|
* About ValidateEmailSyntax(): |
|
206
|
|
|
* This function uses the ValidateUrlSyntax() function to easily check the |
|
207
|
|
|
* syntax of an email address. It accepts the same options as ValidateURLSyntax |
|
208
|
|
|
* but defaults them for email addresses. |
|
209
|
|
|
* |
|
210
|
|
|
* Released under same license as validateUrlSyntax() |
|
211
|
|
|
*/ |
|
212
|
|
|
function validateEmailSyntax($emailaddr, $options = "") |
|
213
|
|
|
{ |
|
214
|
|
|
// Check Options Parameter |
|
215
|
|
|
if (!preg_match('/^([sHSEFuPaIpfqr][+?-])*$/', $options)) { |
|
216
|
|
|
trigger_error("Options attribute malformed", E_USER_ERROR); |
|
217
|
|
|
} |
|
218
|
|
|
|
|
219
|
|
|
// Set Options Array, set defaults if options are not specified |
|
220
|
|
|
// Scheme |
|
221
|
|
|
if (strpos($options, 's') === false) { |
|
222
|
|
|
$aOptions['s'] = '-'; |
|
|
|
|
|
|
223
|
|
|
} else { |
|
224
|
|
|
$aOptions['s'] = substr($options, strpos($options, 's') + 1, 1); |
|
225
|
|
|
} |
|
226
|
|
|
// http:// |
|
227
|
|
|
if (strpos($options, 'H') === false) { |
|
228
|
|
|
$aOptions['H'] = '-'; |
|
229
|
|
|
} else { |
|
230
|
|
|
$aOptions['H'] = substr($options, strpos($options, 'H') + 1, 1); |
|
231
|
|
|
} |
|
232
|
|
|
// https:// (SSL) |
|
233
|
|
|
if (strpos($options, 'S') === false) { |
|
234
|
|
|
$aOptions['S'] = '-'; |
|
235
|
|
|
} else { |
|
236
|
|
|
$aOptions['S'] = substr($options, strpos($options, 'S') + 1, 1); |
|
237
|
|
|
} |
|
238
|
|
|
// mailto: (email) |
|
239
|
|
|
if (strpos($options, 'E') === false) { |
|
240
|
|
|
$aOptions['E'] = '?'; |
|
241
|
|
|
} else { |
|
242
|
|
|
$aOptions['E'] = substr($options, strpos($options, 'E') + 1, 1); |
|
243
|
|
|
} |
|
244
|
|
|
// ftp:// |
|
245
|
|
|
if (strpos($options, 'F') === false) { |
|
246
|
|
|
$aOptions['F'] = '-'; |
|
247
|
|
|
} else { |
|
248
|
|
|
$aOptions['F'] = substr($options, strpos($options, 'F') + 1, 1); |
|
249
|
|
|
} |
|
250
|
|
|
// User section |
|
251
|
|
|
if (strpos($options, 'u') === false) { |
|
252
|
|
|
$aOptions['u'] = '+'; |
|
253
|
|
|
} else { |
|
254
|
|
|
$aOptions['u'] = substr($options, strpos($options, 'u') + 1, 1); |
|
255
|
|
|
} |
|
256
|
|
|
// Password in user section |
|
257
|
|
|
if (strpos($options, 'P') === false) { |
|
258
|
|
|
$aOptions['P'] = '-'; |
|
259
|
|
|
} else { |
|
260
|
|
|
$aOptions['P'] = substr($options, strpos($options, 'P') + 1, 1); |
|
261
|
|
|
} |
|
262
|
|
|
// Address Section |
|
263
|
|
|
if (strpos($options, 'a') === false) { |
|
264
|
|
|
$aOptions['a'] = '+'; |
|
265
|
|
|
} else { |
|
266
|
|
|
$aOptions['a'] = substr($options, strpos($options, 'a') + 1, 1); |
|
267
|
|
|
} |
|
268
|
|
|
// IP Address in address section |
|
269
|
|
|
if (strpos($options, 'I') === false) { |
|
270
|
|
|
$aOptions['I'] = '-'; |
|
271
|
|
|
} else { |
|
272
|
|
|
$aOptions['I'] = substr($options, strpos($options, 'I') + 1, 1); |
|
273
|
|
|
} |
|
274
|
|
|
// Port number |
|
275
|
|
|
if (strpos($options, 'p') === false) { |
|
276
|
|
|
$aOptions['p'] = '-'; |
|
277
|
|
|
} else { |
|
278
|
|
|
$aOptions['p'] = substr($options, strpos($options, 'p') + 1, 1); |
|
279
|
|
|
} |
|
280
|
|
|
// File Path |
|
281
|
|
|
if (strpos($options, 'f') === false) { |
|
282
|
|
|
$aOptions['f'] = '-'; |
|
283
|
|
|
} else { |
|
284
|
|
|
$aOptions['f'] = substr($options, strpos($options, 'f') + 1, 1); |
|
285
|
|
|
} |
|
286
|
|
|
// Query Section |
|
287
|
|
|
if (strpos($options, 'q') === false) { |
|
288
|
|
|
$aOptions['q'] = '-'; |
|
289
|
|
|
} else { |
|
290
|
|
|
$aOptions['q'] = substr($options, strpos($options, 'q') + 1, 1); |
|
291
|
|
|
} |
|
292
|
|
|
// Fragment (Anchor) |
|
293
|
|
|
if (strpos($options, 'r') === false) { |
|
294
|
|
|
$aOptions['r'] = '-'; |
|
295
|
|
|
} else { |
|
296
|
|
|
$aOptions['r'] = substr($options, strpos($options, 'r') + 1, 1); |
|
297
|
|
|
} |
|
298
|
|
|
|
|
299
|
|
|
// Generate options |
|
300
|
|
|
$newoptions = ''; |
|
301
|
|
|
foreach ($aOptions as $key => $value) { |
|
302
|
|
|
$newoptions .= $key.$value; |
|
303
|
|
|
} |
|
304
|
|
|
|
|
305
|
|
|
// DEBUGGING - Uncomment line below to display generated options |
|
306
|
|
|
// echo '<pre>' . $newoptions . '</pre>'; |
|
307
|
|
|
|
|
308
|
|
|
// Send to validateUrlSyntax() and return result |
|
309
|
|
|
return validateUrlSyntax($emailaddr, $newoptions); |
|
310
|
|
|
} // END Function validateEmailSyntax() |
|
311
|
|
|
|
|
312
|
|
|
/** |
|
313
|
|
|
* About ValidateFtpSyntax(): |
|
314
|
|
|
* This function uses the ValidateUrlSyntax() function to easily check the |
|
315
|
|
|
* syntax of an FTP address. It accepts the same options as ValidateURLSyntax |
|
316
|
|
|
* but defaults them for FTP addresses. |
|
317
|
|
|
* |
|
318
|
|
|
* Usage: |
|
319
|
|
|
* <code> |
|
320
|
|
|
* validateFtpSyntax( url_to_check[, options]) |
|
321
|
|
|
* </code> |
|
322
|
|
|
* url_to_check - string - The url to check |
|
323
|
|
|
* |
|
324
|
|
|
* options - string - A optional string of options to set which parts of |
|
325
|
|
|
* the url are required, optional, or not allowed. Each option |
|
326
|
|
|
* must be followed by a "+" for required, "?" for optional, or |
|
327
|
|
|
* "-" for not allowed. See ValidateUrlSyntax() docs for option list. |
|
328
|
|
|
* |
|
329
|
|
|
* The default options are changed to: |
|
330
|
|
|
* s?H-S-E-F+u?P?a+I?p?f?q-r- |
|
331
|
|
|
* |
|
332
|
|
|
* Examples: |
|
333
|
|
|
* <code> |
|
334
|
|
|
* validateFtpSyntax('ftp://netscape.com') |
|
335
|
|
|
* validateFtpSyntax('moz:[email protected]') |
|
336
|
|
|
* validateFtpSyntax('ftp://netscape.com:2121/browsers/ns7/', 'u-') |
|
337
|
|
|
* </code> |
|
338
|
|
|
* |
|
339
|
|
|
* Author(s): |
|
340
|
|
|
* Rod Apeldoorn - rod(at)canowhoopass(dot)com |
|
341
|
|
|
* |
|
342
|
|
|
* |
|
343
|
|
|
* Homepage: |
|
344
|
|
|
* http://www.canowhoopass.com/ |
|
345
|
|
|
* |
|
346
|
|
|
* |
|
347
|
|
|
* License: |
|
348
|
|
|
* Copyright 2004 - Rod Apeldoorn |
|
349
|
|
|
* |
|
350
|
|
|
* Released under same license as validateUrlSyntax(). For details, contact me. |
|
351
|
|
|
*/ |
|
352
|
|
|
function validateFtpSyntax($ftpaddr, $options = "") |
|
353
|
|
|
{ |
|
354
|
|
|
// Check Options Parameter |
|
355
|
|
|
if (!preg_match('/^([sHSEFuPaIpfqr][+?-])*$/', $options)) { |
|
356
|
|
|
trigger_error("Options attribute malformed", E_USER_ERROR); |
|
357
|
|
|
} |
|
358
|
|
|
|
|
359
|
|
|
// Set Options Array, set defaults if options are not specified |
|
360
|
|
|
// Scheme |
|
361
|
|
|
if (strpos($options, 's') === false) { |
|
362
|
|
|
$aOptions['s'] = '?'; |
|
|
|
|
|
|
363
|
|
|
} else { |
|
364
|
|
|
$aOptions['s'] = substr($options, strpos($options, 's') + 1, 1); |
|
365
|
|
|
} |
|
366
|
|
|
// http:// |
|
367
|
|
|
if (strpos($options, 'H') === false) { |
|
368
|
|
|
$aOptions['H'] = '-'; |
|
369
|
|
|
} else { |
|
370
|
|
|
$aOptions['H'] = substr($options, strpos($options, 'H') + 1, 1); |
|
371
|
|
|
} |
|
372
|
|
|
// https:// (SSL) |
|
373
|
|
|
if (strpos($options, 'S') === false) { |
|
374
|
|
|
$aOptions['S'] = '-'; |
|
375
|
|
|
} else { |
|
376
|
|
|
$aOptions['S'] = substr($options, strpos($options, 'S') + 1, 1); |
|
377
|
|
|
} |
|
378
|
|
|
// mailto: (email) |
|
379
|
|
|
if (strpos($options, 'E') === false) { |
|
380
|
|
|
$aOptions['E'] = '-'; |
|
381
|
|
|
} else { |
|
382
|
|
|
$aOptions['E'] = substr($options, strpos($options, 'E') + 1, 1); |
|
383
|
|
|
} |
|
384
|
|
|
// ftp:// |
|
385
|
|
|
if (strpos($options, 'F') === false) { |
|
386
|
|
|
$aOptions['F'] = '+'; |
|
387
|
|
|
} else { |
|
388
|
|
|
$aOptions['F'] = substr($options, strpos($options, 'F') + 1, 1); |
|
389
|
|
|
} |
|
390
|
|
|
// User section |
|
391
|
|
|
if (strpos($options, 'u') === false) { |
|
392
|
|
|
$aOptions['u'] = '?'; |
|
393
|
|
|
} else { |
|
394
|
|
|
$aOptions['u'] = substr($options, strpos($options, 'u') + 1, 1); |
|
395
|
|
|
} |
|
396
|
|
|
// Password in user section |
|
397
|
|
|
if (strpos($options, 'P') === false) { |
|
398
|
|
|
$aOptions['P'] = '?'; |
|
399
|
|
|
} else { |
|
400
|
|
|
$aOptions['P'] = substr($options, strpos($options, 'P') + 1, 1); |
|
401
|
|
|
} |
|
402
|
|
|
// Address Section |
|
403
|
|
|
if (strpos($options, 'a') === false) { |
|
404
|
|
|
$aOptions['a'] = '+'; |
|
405
|
|
|
} else { |
|
406
|
|
|
$aOptions['a'] = substr($options, strpos($options, 'a') + 1, 1); |
|
407
|
|
|
} |
|
408
|
|
|
// IP Address in address section |
|
409
|
|
|
if (strpos($options, 'I') === false) { |
|
410
|
|
|
$aOptions['I'] = '?'; |
|
411
|
|
|
} else { |
|
412
|
|
|
$aOptions['I'] = substr($options, strpos($options, 'I') + 1, 1); |
|
413
|
|
|
} |
|
414
|
|
|
// Port number |
|
415
|
|
|
if (strpos($options, 'p') === false) { |
|
416
|
|
|
$aOptions['p'] = '?'; |
|
417
|
|
|
} else { |
|
418
|
|
|
$aOptions['p'] = substr($options, strpos($options, 'p') + 1, 1); |
|
419
|
|
|
} |
|
420
|
|
|
// File Path |
|
421
|
|
|
if (strpos($options, 'f') === false) { |
|
422
|
|
|
$aOptions['f'] = '?'; |
|
423
|
|
|
} else { |
|
424
|
|
|
$aOptions['f'] = substr($options, strpos($options, 'f') + 1, 1); |
|
425
|
|
|
} |
|
426
|
|
|
// Query Section |
|
427
|
|
|
if (strpos($options, 'q') === false) { |
|
428
|
|
|
$aOptions['q'] = '-'; |
|
429
|
|
|
} else { |
|
430
|
|
|
$aOptions['q'] = substr($options, strpos($options, 'q') + 1, 1); |
|
431
|
|
|
} |
|
432
|
|
|
// Fragment (Anchor) |
|
433
|
|
|
if (strpos($options, 'r') === false) { |
|
434
|
|
|
$aOptions['r'] = '-'; |
|
435
|
|
|
} else { |
|
436
|
|
|
$aOptions['r'] = substr($options, strpos($options, 'r') + 1, 1); |
|
437
|
|
|
} |
|
438
|
|
|
|
|
439
|
|
|
// Generate options |
|
440
|
|
|
$newoptions = ''; |
|
441
|
|
|
foreach ($aOptions as $key => $value) { |
|
442
|
|
|
$newoptions .= $key.$value; |
|
443
|
|
|
} |
|
444
|
|
|
|
|
445
|
|
|
// Send to validateUrlSyntax() and return result |
|
446
|
|
|
return validateUrlSyntax($ftpaddr, $newoptions); |
|
447
|
|
|
} // END Function validateFtpSyntax() |
|
448
|
|
|
|