ѡ̳

 找回密码
 ע
搜索
查看: 397|回复: 0
打印 上一主题 下一主题

thinkphp公共函数之U函数

[复制链接]

789

主题

1158

帖子

4197

积分

Ա

Rank: 9Rank: 9Rank: 9

积分
4197
跳转到指定楼层
¥
发表于 2017-11-12 17:17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源码
  1. /**
  2. * URL组装 支持不同URL模式
  3. * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
  4. * @param string|array $vars 传入的参数,支持数组和字符串
  5. * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
  6. * @param boolean $domain 是否显示域名
  7. * @return string
  8. */
  9. function U($url='',$vars='',$suffix=true,$domain=false) {
  10.     // 解析URL
  11.     $info   =  parse_url($url);
  12.     $url    =  !empty($info['path'])?$info['path']:ACTION_NAME;
  13.     if(isset($info['fragment'])) { // 解析锚点
  14.         $anchor =   $info['fragment'];
  15.         if(false !== strpos($anchor,'?')) { // 解析参数
  16.             list($anchor,$info['query']) = explode('?',$anchor,2);
  17.         }        
  18.         if(false !== strpos($anchor,'@')) { // 解析域名
  19.             list($anchor,$host)    =   explode('@',$anchor, 2);
  20.         }
  21.     }elseif(false !== strpos($url,'@')) { // 解析域名
  22.         list($url,$host)    =   explode('@',$info['path'], 2);
  23.     }
  24.     // 解析子域名
  25.     if(isset($host)) {
  26.         $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.'));
  27.     }elseif($domain===true){
  28.         $domain = $_SERVER['HTTP_HOST'];
  29.         if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署
  30.             $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.');
  31.             // '子域名'=>array('模块[/控制器]');
  32.             foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) {
  33.                 $rule   =   is_array($rule)?$rule[0]:$rule;
  34.                 if(false === strpos($key,'*') && 0=== strpos($url,$rule)) {
  35.                     $domain = $key.strstr($domain,'.'); // 生成对应子域名
  36.                     $url    =  substr_replace($url,'',0,strlen($rule));
  37.                     break;
  38.                 }
  39.             }
  40.         }
  41.     }

  42.     // 解析参数
  43.     if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
  44.         parse_str($vars,$vars);
  45.     }elseif(!is_array($vars)){
  46.         $vars = array();
  47.     }
  48.     if(isset($info['query'])) { // 解析地址里面参数 合并到vars
  49.         parse_str($info['query'],$params);
  50.         $vars = array_merge($params,$vars);
  51.     }
  52.    
  53.     // URL组装
  54.     $depr       =   C('URL_PATHINFO_DEPR');
  55.     $urlCase    =   C('URL_CASE_INSENSITIVE');
  56.     if($url) {
  57.         if(0=== strpos($url,'/')) {// 定义路由
  58.             $route      =   true;
  59.             $url        =   substr($url,1);
  60.             if('/' != $depr) {
  61.                 $url    =   str_replace('/',$depr,$url);
  62.             }
  63.         }else{
  64.             if('/' != $depr) { // 安全替换
  65.                 $url    =   str_replace('/',$depr,$url);
  66.             }
  67.             // 解析模块、控制器和操作
  68.             $url        =   trim($url,$depr);
  69.             $path       =   explode($depr,$url);
  70.             $var        =   array();
  71.             $varModule      =   C('VAR_MODULE');
  72.             $varController  =   C('VAR_CONTROLLER');
  73.             $varAction      =   C('VAR_ACTION');
  74.             $var[$varAction]       =   !empty($path)?array_pop($path):ACTION_NAME;
  75.             $var[$varController]   =   !empty($path)?array_pop($path):CONTROLLER_NAME;
  76.             if($maps = C('URL_ACTION_MAP')) {
  77.                 if(isset($maps[strtolower($var[$varController])])) {
  78.                     $maps    =   $maps[strtolower($var[$varController])];
  79.                     if($action = array_search(strtolower($var[$varAction]),$maps)){
  80.                         $var[$varAction] = $action;
  81.                     }
  82.                 }
  83.             }
  84.             if($maps = C('URL_CONTROLLER_MAP')) {
  85.                 if($controller = array_search(strtolower($var[$varController]),$maps)){
  86.                     $var[$varController] = $controller;
  87.                 }
  88.             }
  89.             if($urlCase) {
  90.                 $var[$varController]   =   parse_name($var[$varController]);
  91.             }
  92.             $module =   '';
  93.             
  94.             if(!empty($path)) {
  95.                 $var[$varModule]    =   implode($depr,$path);
  96.             }else{
  97.                 if(C('MULTI_MODULE')) {
  98.                     if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){
  99.                         $var[$varModule]=   MODULE_NAME;
  100.                     }
  101.                 }
  102.             }
  103.             if($maps = C('URL_MODULE_MAP')) {
  104.                 if($_module = array_search(strtolower($var[$varModule]),$maps)){
  105.                     $var[$varModule] = $_module;
  106.                 }
  107.             }
  108.             if(isset($var[$varModule])){
  109.                 $module =   $var[$varModule];
  110.                 unset($var[$varModule]);
  111.             }
  112.             
  113.         }
  114.     }

  115.     if(C('URL_MODEL') == 0) { // 普通模式URL转换
  116.         $url        =   __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var));
  117.         if($urlCase){
  118.             $url    =   strtolower($url);
  119.         }        
  120.         if(!empty($vars)) {
  121.             $vars   =   http_build_query($vars);
  122.             $url   .=   '&'.$vars;
  123.         }
  124.     }else{ // PATHINFO模式或者兼容URL模式
  125.         if(isset($route)) {
  126.             $url    =   __APP__.'/'.rtrim($url,$depr);
  127.         }else{
  128.             $module =   (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module;
  129.             $url    =   __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var));
  130.         }
  131.         if($urlCase){
  132.             $url    =   strtolower($url);
  133.         }
  134.         if(!empty($vars)) { // 添加参数
  135.             foreach ($vars as $var => $val){
  136.                 if('' !== trim($val))   $url .= $depr . $var . $depr . urlencode($val);
  137.             }               
  138.         }
  139.         if($suffix) {
  140.             $suffix   =  $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
  141.             if($pos = strpos($suffix, '|')){
  142.                 $suffix = substr($suffix, 0, $pos);
  143.             }
  144.             if($suffix && '/' != substr($url,-1)){
  145.                 $url  .=  '.'.ltrim($suffix,'.');
  146.             }
  147.         }
  148.     }
  149.     if(isset($anchor)){
  150.         $url  .= '#'.$anchor;
  151.     }
  152.     if($domain) {
  153.         $url   =  (is_ssl()?'https://':'http://').$domain.$url;
  154.     }
  155.     return $url;
  156. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | ע

本版积分规则

QQ|Archiver|ֻ|С|ѡ̳

GMT+8, 2026-5-2 04:39 , Processed in 0.076523 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表
0.0898s