-// ---------------------
-// Compat etc
-
-// (PHP 4 >= 4.2.0): var_export(): mail-reporting and dump related
-if (! function_exists('var_export')) {
- function var_export() {
- return 'var_export() is not found on this server' . "\n";
- }
-}
-
-// (PHP 4 >= 4.2.0): preg_grep() enables invert option
-function preg_grep_invert($pattern = '//', $input = array())
-{
- static $invert;
- if (! isset($invert)) $invert = defined('PREG_GREP_INVERT');
-
- if ($invert) {
- return preg_grep($pattern, $input, PREG_GREP_INVERT);
- } else {
- $result = preg_grep($pattern, $input);
- if ($result) {
- return array_diff($input, preg_grep($pattern, $input));
- } else {
- return $input;
- }
- }
-}
-
-// ---------------------
-// URI pickup
-
-// Return an array of URIs in the $string
-// [OK] http://nasty.example.org#nasty_string
-// [OK] http://nasty.example.org:80/foo/xxx#nasty_string/bar
-// [OK] ftp://nasty.example.org:80/dfsdfs
-// [OK] ftp://cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm (from RFC3986)
-function uri_pickup($string = '', $normalize = TRUE,
- $preserve_rawuri = FALSE, $preserve_chunk = TRUE)
-{
- // Not available for: IDN(ignored)
- $array = array();
- preg_match_all(
- // scheme://userinfo@host:port/path/or/pathinfo/maybefile.and?query=string#fragment
- // Refer RFC3986 (Regex below is not strict)
- '#(\b[a-z][a-z0-9.+-]{1,8}):/+' . // 1: Scheme
- '(?:' .
- '([^\s<>"\'\[\]/\#?@]*)' . // 2: Userinfo (Username)
- '@)?' .
- '(' .
- // 3: Host
- '\[[0-9a-f:.]+\]' . '|' . // IPv6([colon-hex and dot]): RFC2732
- '(?:[0-9]{1-3}\.){3}[0-9]{1-3}' . '|' . // IPv4(dot-decimal): 001.22.3.44
- '[a-z0-9.-]+' . // hostname(FQDN) : foo.example.org
- ')' .
- '(?::([0-9]*))?' . // 4: Port
- '((?:/+[^\s<>"\'\[\]/\#]+)*/+)?' . // 5: Directory path or path-info
- '([^\s<>"\'\[\]\#?]+)?' . // 6: File?
- '(?:\?([^\s<>"\'\[\]\#]+))?' . // 7: Query string
- '(?:\#([a-z0-9._~%!$&\'()*+,;=:@-]*))?' . // 8: Fragment
- '#i',
- $string, $array, PREG_SET_ORDER | PREG_OFFSET_CAPTURE
- );
-
- // Shrink $array
- static $parts = array(
- 1 => 'scheme', 2 => 'userinfo', 3 => 'host', 4 => 'port',
- 5 => 'path', 6 => 'file', 7 => 'query', 8 => 'fragment'
- );
- $default = array('');
- foreach(array_keys($array) as $uri) {
- $_uri = & $array[$uri];
- array_rename_keys($_uri, $parts, TRUE, $default);
-
- $offset = $_uri['scheme'][1]; // Scheme's offset
- foreach(array_keys($_uri) as $part) {
- // Remove offsets for each part
- $_uri[$part] = & $_uri[$part][0];
- }
-
- if ($normalize) {
- $_uri['scheme'] = scheme_normalize($_uri['scheme']);
- if ($_uri['scheme'] === '') {
- unset($array[$uri]);
- continue;
- }
- $_uri['host'] = strtolower($_uri['host']);
- $_uri['port'] = port_normalize($_uri['port'], $_uri['scheme'], FALSE);
- $_uri['path'] = path_normalize($_uri['path']);
- if ($preserve_rawuri) $_uri['rawuri'] = & $_uri[0];
-
- // DEBUG
- //$_uri['uri'] = uri_array_implode($_uri);
- } else {
- $_uri['uri'] = & $_uri[0]; // Raw
- }
- unset($_uri[0]); // Matched string itself
- if (! $preserve_chunk) {
- unset(
- $_uri['scheme'],
- $_uri['userinfo'],
- $_uri['host'],
- $_uri['port'],
- $_uri['path'],
- $_uri['file'],
- $_uri['query'],
- $_uri['fragment']
- );
- }
-
- // Area offset for area_measure()
- $_uri['area']['offset'] = $offset;
- }
-
- return $array;
-}
-
-// Destructive normalize of URI array
-// NOTE: Give me the uri_pickup() result with chunks
-function uri_array_normalize(& $pickups, $preserve = TRUE)
-{
- if (! is_array($pickups)) return $pickups;
-
- foreach (array_keys($pickups) as $key) {
- $_key = & $pickups[$key];
- $_key['path'] = isset($_key['path']) ? strtolower($_key['path']) : '';
- $_key['file'] = isset($_key['file']) ? file_normalize($_key['file']) : '';
- $_key['query'] = isset($_key['query']) ? query_normalize(strtolower($_key['query']), TRUE) : '';
- $_key['fragment'] = (isset($_key['fragment']) && $preserve) ?
- strtolower($_key['fragment']) : ''; // Just ignore
- }
-
- return $pickups;
-}
-
-// An URI array => An URI (See uri_pickup())
-function uri_array_implode($uri = array())
-{
- if (empty($uri) || ! is_array($uri)) return NULL;
-
- $tmp = array();
- if (isset($uri['scheme']) && $uri['scheme'] !== '') {
- $tmp[] = & $uri['scheme'];
- $tmp[] = '://';
- }
- if (isset($uri['userinfo']) && $uri['userinfo'] !== '') {
- $tmp[] = & $uri['userinfo'];
- $tmp[] = '@';
- }
- if (isset($uri['host']) && $uri['host'] !== '') {
- $tmp[] = & $uri['host'];
- }
- if (isset($uri['port']) && $uri['port'] !== '') {
- $tmp[] = ':';
- $tmp[] = & $uri['port'];
- }
- if (isset($uri['path']) && $uri['path'] !== '') {
- $tmp[] = & $uri['path'];
- }
- if (isset($uri['file']) && $uri['file'] !== '') {
- $tmp[] = & $uri['file'];
- }
- if (isset($uri['query']) && $uri['query'] !== '') {
- $tmp[] = '?';
- $tmp[] = & $uri['query'];
- }
- if (isset($uri['fragment']) && $uri['fragment'] !== '') {
- $tmp[] = '#';
- $tmp[] = & $uri['fragment'];
- }