/** * Returns an url composed of params joined with / * A param can be a string or an array. * If param is an array, its members will be added at the end of the return url * as GET parameters "&key=value". * * @param string or array $param1, $param2 ... * @return string */ function url_for($params = null) { $paths = array(); $params = func_get_args(); $GET_params = array(); foreach ($params as $param) { if (is_array($param)) { $GET_params = array_merge($GET_params, $param); continue; } if (filter_var_url($param)) { $paths[] = $param; continue; } $p = explode('/', $param); foreach ($p as $v) { if ($v != "") { $paths[] = str_replace('%23', '#', rawurlencode($v)); } } } $path = rtrim(implode('/', $paths), '/'); if (!filter_var_url($path)) { # it's a relative URL or an URL without a schema $base_uri = option('base_uri'); $path = file_path($base_uri, $path); } if (!empty($GET_params)) { $is_first_qs_param = true; $path_as_no_question_mark = strpos($path, '?') === false; foreach ($GET_params as $k => $v) { $qs_separator = $is_first_qs_param && $path_as_no_question_mark ? '?' : '&'; $path .= $qs_separator . rawurlencode($k) . '=' . rawurlencode($v); $is_first_qs_param = false; } } if (DIRECTORY_SEPARATOR != '/') { $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); } return $path; }
function test_main_url_for() { assert_equal(url_for(''), '/'); assert_equal(url_for('/'), '/'); assert_equal(url_for('test'), '/test'); assert_equal(url_for('mañana'), '/'.rawurlencode("mañana")); assert_equal(url_for('test', 1, 2), '/test/1/2'); assert_equal(url_for('one', 'two', 'three'), '/one/two/three'); assert_equal(url_for('one', 0, 'three'), '/one/0/three'); assert_equal(url_for('one', '', 'three'), '/one/three'); assert_equal(url_for('one', null, 'three'), '/one/three'); assert_equal(url_for('my/hash#test'), '/my/hash#test'); $site_url = 'http://www.limonade-php.net'; assert_true((bool) filter_var_url($site_url)); assert_true((bool) filter_var_url('http://example.com')); assert_true((bool) filter_var_url('http://example.com:2000/')); assert_true((bool) filter_var_url('https://www.example.com:2000')); assert_true((bool) filter_var_url('http://test.example.com/?var1=true&var2=34')); assert_false(filter_var_url('not an url')); assert_equal(url_for($site_url), $site_url); //var_dump(url_for($site_url, 'examples')); assert_equal(url_for($site_url, 'examples'), $site_url.'/examples'); $ssite_url = 'https://www.limonade-php.net'; assert_equal(url_for($ssite_url), $ssite_url); option('base_uri', '?'); $url = url_for('test', array('p1' => 'lorem', 'p2' => 'ipsum')); assert_equal($url,'?/test&p1=lorem&p2=ipsum'); $url = url_for('test', array(0 => 'lorem', 'p2' => 1)); assert_equal($url,'?/test&0=lorem&p2=1'); $url = url_for('test', array('p1' => 'mañana')); assert_equal($url,'?/test&p1='.rawurlencode("mañana")); option('base_uri', '/api'); $url = url_for('test', array('p1' => 'lorem', 'p2' => 'ipsum')); assert_equal($url,'/api/test?p1=lorem&p2=ipsum'); }
/** * Returns an url composed of params joined with / * A param can be a string or an array. * If param is an array, its members will be added at the end of the return url * as GET parameters "&key=value". * * @param string or array $param1, $param2 ... * @return string */ function url_for($params = null) { $paths = array(); $params = func_get_args(); $GET_params = array(); foreach ($params as $param) { if (is_array($param)) { $GET_params = array_merge($GET_params, $param); continue; } if (filter_var_url($param)) { $paths[] = $param; continue; } $p = explode('/', $param); foreach ($p as $v) { if (!empty($v)) { $paths[] = str_replace('%23', '#', rawurlencode($v)); } } } $path = rtrim(implode('/', $paths), '/'); if (!empty($GET_params)) { foreach ($GET_params as $k => $v) { $path .= '&' . rawurlencode($k) . '=' . rawurlencode($v); } } if (!filter_var_url($path)) { # it's a relative URL or an URL without a schema $base_uri = option('base_uri'); $path = file_path($base_uri, $path); } if (DIRECTORY_SEPARATOR != '/') { $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); } return $path; }
function test_main_url_for() { assert_equal(url_for(''), '/'); assert_equal(url_for('/'), '/'); assert_equal(url_for('test'), '/test'); assert_equal(url_for('mañana'), '/' . rawurlencode("mañana")); assert_equal(url_for('test', 1, 2), '/test/1/2'); assert_equal(url_for('one', 'two', 'three'), '/one/two/three'); assert_equal(url_for('my/hash#test'), '/my/hash#test'); $site_url = 'http://www.limonade-php.net'; assert_true((bool) filter_var_url($site_url)); assert_equal(url_for($site_url), $site_url); //var_dump(url_for($site_url, 'examples')); assert_equal(url_for($site_url, 'examples'), $site_url . '/examples'); $ssite_url = 'https://www.limonade-php.net'; assert_equal(url_for($ssite_url), $ssite_url); $url = url_for('test', array('p1' => 'lorem', 'p2' => 'ipsum')); assert_equal($url, '/test&p1=lorem&p2=ipsum'); $url = url_for('test', array(0 => 'lorem', 'p2' => 1)); assert_equal($url, '/test&0=lorem&p2=1'); $url = url_for('test', array('p1' => 'mañana')); assert_equal($url, '/test&p1=' . rawurlencode("mañana")); }