type = array( //0 => dr_lang('自定义页面插件'), 1 => dr_lang('独立模块'), 2 => dr_lang('共享模块搜索'), 3 => dr_lang('共享栏目和内容页'), //5 => dr_lang('模块表单'), ); if (!dr_is_app('page')) { unset($this->type[0]); } \Phpcmf\Service::V()->assign([ 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ 'URL规则' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-link'], '添加' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'], '修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'], '伪静态' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/rewrite_index', 'fa fa-cog'], '导入' => ['add:'.APP_DIR.'/urlrule/import_add', 'fa fa-sign-in', '60%', '70%'], 'help' => [418], ] ), ]); // 支持附表存储 $this->is_data = 0; $this->my_field = array( 'name' => array( 'ismain' => 1, 'name' => dr_lang('名称'), 'fieldname' => 'name', 'fieldtype' => 'Text', 'setting' => array( 'option' => array( 'width' => 200, ), 'validate' => array( 'required' => 1, ) ) ), ); // url显示名称 $this->name = dr_lang('URL规则'); // 初始化数据表 $this->_init([ 'table' => 'urlrule', 'field' => $this->my_field, 'order_by' => 'id desc', ]); } // 后台查看url列表 public function index() { $this->_List([], -1); \Phpcmf\Service::V()->assign('color', [ 0 => 'default', 1 => 'info', 2 => 'success', 3 => 'warning', 4 => 'danger', 5 => '', 6 => 'primary', ]); \Phpcmf\Service::V()->display('urlrule_index.html'); } // 伪静态 public function rewrite_index() { $domain = []; list($module, $site) = \Phpcmf\Service::M('Site')->domain(); $domain[$site['site_domain']] = dr_lang('本站电脑域名'); $site['mobile_domain'] && $domain[$site['mobile_domain']] = dr_lang('本站手机域名'); if ($module) { foreach ($module as $dir => $t) { if ($site['module_'.$dir]) { $domain[$site['module_'.$dir]] = dr_lang('%s电脑域名', $t['name']); } if ($site['module_mobile_'.$dir]) { $domain[$site['module_mobile_'.$dir]] = dr_lang('%s手机域名', $t['name']); } } } $site = \Phpcmf\Service::M('Site')->config(SITE_ID); if ($site['client']) { foreach ($site['client'] as $t) { if ($t['domain']) { $domain[$t['domain']] = dr_lang('%s终端域名', $t['name']); } } } if (strpos($site['config']['SITE_DOMAIN'], '/') !== false) { list($a, $b) = explode('/', $site['config']['SITE_DOMAIN']); $root = '/'.$b; } else { $root = ''; } $server = strtolower($_SERVER['SERVER_SOFTWARE']); if (strpos($server, 'apache') !== FALSE) { $name = 'Apache'; $note = ''.dr_lang('将以下内容保存为.htaccess文件,放到每个域名所绑定的根目录').''; $code = ''; // 子目录 $code.= '###当存在多个子目录格式的域名时,需要多写几组RewriteBase标签:RewriteBase /目录/ '.PHP_EOL; if (isset($site['mobile']['mode']) && $site['mobile']['mode'] && $site['mobile']['dirname']) { $code.= 'RewriteEngine On'.PHP_EOL.PHP_EOL; $code.= 'RewriteBase /'.$site['mobile']['dirname'].'/'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ /'.$site['mobile']['dirname'].'/index.php [NC,L]'.PHP_EOL.PHP_EOL; $code.= '####以上目录需要单独保持到/'.$site['mobile']['dirname'].'/.htaccess文件中'; } // 主目录 $code.= 'RewriteEngine On'.PHP_EOL.PHP_EOL; $code.= 'RewriteBase '.$root.'/'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ '.$root.'/index.php [NC,L]'.PHP_EOL.PHP_EOL; } elseif (strpos($server, 'nginx') !== FALSE) { $name = $server; $note = ''.dr_lang('将以下代码放到Nginx配置文件中去(如果是绑定了域名,所绑定目录也要配置下面的代码)').''; // 子目录 $code = '###当存在多个子目录格式的域名时,需要多写几组location标签:location /目录/ '.PHP_EOL; if (isset($site['mobile']['mode']) && $site['mobile']['mode'] && $site['mobile']['dirname']) { $code.= 'location '.$root.'/'.$site['mobile']['dirname'].'/ { '.PHP_EOL .' if (-f $request_filename) {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if ($request_filename ~* "\.(js|ico|gif|jpe?g|bmp|png|css)$") {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if (!-e $request_filename) {'.PHP_EOL .' rewrite . '.$root.'/'.$site['mobile']['dirname'].'/index.php last;'.PHP_EOL .' }'.PHP_EOL .'}'.PHP_EOL.PHP_EOL; } // 主目录 $code.= 'location '.$root.'/ { '.PHP_EOL .' if (-f $request_filename) {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if ($request_filename ~* "\.(js|ico|gif|jpe?g|bmp|png|css)$") {'.PHP_EOL .' break;'.PHP_EOL .' }'.PHP_EOL .' if (!-e $request_filename) {'.PHP_EOL .' rewrite . '.$root.'/index.php last;'.PHP_EOL .' }'.PHP_EOL .'}'.PHP_EOL; } else { $name = $server; $note = ''.dr_lang('无法为此服务器提供伪静态规则,建议让运营商帮你把下面的Apache规则做转换').''; $code = 'RewriteEngine On'.PHP_EOL .'RewriteBase /'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ /index.php [NC,L]'; } \Phpcmf\Service::V()->assign([ 'name' => $name, 'code' => $code, 'note' => $note, 'site' => $site, 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ 'URL规则' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-link'], '伪静态' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/rewrite_index', 'fa fa-cog'], 'help' => [21], ] ), 'count' => $code ? dr_count(explode(PHP_EOL, $code)) : 0, 'domain' => $domain, ]); \Phpcmf\Service::V()->display('urlrule_rewrite.html'); } // 后台添加url内容 public function add() { $this->_Post(0); \Phpcmf\Service::V()->display('urlrule_add.html'); } // 后台修改url内容 public function edit() { $this->_Post(intval(\Phpcmf\Service::L('input')->get('id'))); \Phpcmf\Service::V()->display('urlrule_add.html'); } // 复制url public function copy_edit() { $id = intval(\Phpcmf\Service::L('input')->get('id')); $data = \Phpcmf\Service::M()->db->table('urlrule')->where('id', $id)->get()->getRowArray(); if (!$data) { $this->_json(0, dr_lang('数据#%s不存在', $id)); } unset($data['id']); $data['name'].= '_copy'; $rt = \Phpcmf\Service::M()->table('urlrule')->insert($data); if (!$rt['code']) { $this->_json(0, dr_lang($rt['msg'])); } \Phpcmf\Service::M('cache')->sync_cache('urlrule', 'module'); $this->_json(1, dr_lang('复制成功')); } // 保存 protected function _Save($id = 0, $data = [], $old = [], $func = null, $func2 = null) { return parent::_Save($id, $data, $old, function($id, $data){ // 保存前的格式化 $type = (int)\Phpcmf\Service::L('input')->post('type'); $value = \Phpcmf\Service::L('input')->post('value'); if ($value[$type]) { foreach ($value[$type] as $i => $t) { if (strpos($t, '?') !== false) { $this->_json(0, dr_lang('URL规则中不能包含%s号', '?')); } elseif (strpos($t, '#') !== false) { $this->_json(0, dr_lang('URL规则中不能包含%s号', '#')); } elseif (strpos($t, '(') && preg_match('/\{([a-z0-9_]+)\(\$data\)\}/iU', $t, $mt)) { if (!function_exists($mt[1])) { $this->_json(0, dr_lang('URL规则中函数%s未定义', $mt[1])); } } $value[$type][$i] = trim($t); } } $data[1]['type'] = $type; $join = \Phpcmf\Service::L('input')->post('catjoin'); $value[$type]['catjoin'] = $join ? $join : '/'; $data[1]['value'] = dr_array2string($value[$type]); return dr_return_data(1, 'ok', $data); }, function ($id, $data, $old) { \Phpcmf\Service::M('cache')->sync_cache('urlrule', 'module'); }); } // 导出 public function export_edit() { $id = intval(\Phpcmf\Service::L('input')->get('id')); $data = \Phpcmf\Service::M()->table('urlrule')->get($id); if (!$data) { $this->_admin_msg(0, dr_lang('URL规则(%s)不存在', $id)); } \Phpcmf\Service::V()->assign([ 'data' => dr_array2string($data), ]); \Phpcmf\Service::V()->display('api_export_code.html');exit; } // 导入 public function import_add() { if (IS_AJAX_POST) { $data = \Phpcmf\Service::L('input')->post('code'); $data = dr_string2array($data); if (!is_array($data)) { $this->_json(0, dr_lang('导入信息验证失败')); } elseif (!$data['value']) { $this->_json(0, dr_lang('导入信息不完整')); } unset($data['id']); $rt = \Phpcmf\Service::M()->table('urlrule')->insert($data); if (!$rt['code']) { $this->_json(0, $rt['msg']); } \Phpcmf\Service::M('cache')->sync_cache('urlrule', 'module'); $this->_json(1, dr_lang('操作成功')); } \Phpcmf\Service::V()->assign([ 'data' => '', 'form' => dr_form_hidden(), ]); \Phpcmf\Service::V()->display('api_export_code.html'); exit; } /** * 获取内容 * $id 内容id,新增为0 * */ protected function _Data($id = 0) { $data = parent::_Data($id); $data['value'] = dr_string2array($data['value']); return $data; } // 后台删除url内容 public function del() { $this->_Del( \Phpcmf\Service::L('input')->get_post_ids(), null, function ($r) { \Phpcmf\Service::M('cache')->sync_cache('urlrule', 'module'); } ); } // 生成伪静态解析文件规则 public function rewrite_add() { $rt = $this->get_rewrite_code(); $this->_json($rt['code'], $rt['msg'], $rt['data']); } // 生成伪静态解析代码 private function get_rewrite_code() { $data = \Phpcmf\Service::M()->table('urlrule')->getAll(); if (!$data) { return dr_return_data(0, dr_lang('你没有设置URL规则')); } $code = ''; $error = ''; $write = []; // 防止重复 foreach ($data as $r) { $value = dr_string2array($r['value']); if ($r['type'] == 1) { // 独立模块 $code.= PHP_EOL.' // '.$r['name'].'---解析规则----开始'.PHP_EOL; if ($value['module']) { $rule = $value['module']; $cname = "【".$r['name']."】模块首页({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg) { $error.= "
".$cname."无法识别,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rule = 'index.php?s=手动填写模块目录'; } else { $rule = 'index.php?s=$'.$rname['{modname}']; } if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= ''; } } } if ($value['list_page']) { $rule = $value['list_page']; $cname = "【".$r['name']."】模块栏目列表(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{page}'])) { $error.= "".$cname."缺少{page}标签,需要手动写解析规则
"; } elseif (!isset($rname['{dirname}']) && !isset($rname['{id}']) && !isset($rname['{pdirname}'])) { $error.= "".$cname."缺少{dirname}或{id}或{pdirname}标签,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } if (isset($rname['{dirname}'])) { // 目录格式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&dir=$'.$rname['{dirname}'].'&page=$'.$rname['{page}']; } elseif (isset($rname['{pdirname}'])) { // 层次目录格式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&dir=$'.$rname['{pdirname}'].'&page=$'.$rname['{page}']; } else { // id模式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&id=$'.$rname['{id}'].'&page=$'.$rname['{page}']; } $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= ''; } } } if ($value['list']) { $rule = $value['list']; $cname = "【".$r['name']."】模块栏目列表({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{dirname}']) && !isset($rname['{id}']) && !isset($rname['{pdirname}'])) { $error.= "".$cname."缺少{dirname}或{id}或{pdirname}标签,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } if (isset($rname['{dirname}'])) { // 目录格式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&dir=$'.$rname['{dirname}']; } elseif (isset($rname['{pdirname}'])) { // 层次目录格式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&dir=$'.$rname['{pdirname}']; } else { // id模式 $rule = 'index.php?s=$'.$rname['{modname}'].'&c=category&id=$'.$rname['{id}']; } $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['show_page']) { $rule = $value['show_page']; $cname = "【".$r['name']."】模块内容页(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{id}'])) { $error.= "".$cname."缺少{id}标签,需要手动写解析规则
"; } elseif (!isset($rname['{page}'])) { $error.= "".$cname."缺少{page}标签,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } $rule = 'index.php?s=$'.$rname['{modname}'].'&c=show&id=$'.$rname['{id}'].'&page=$'.$rname['{page}']; $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['show']) { $rule = $value['show']; $cname = "【".$r['name']."】模块内容页({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{id}'])) { $error.= "".$cname."缺少{id}标签,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } $rule = 'index.php?s=$'.$rname['{modname}'].'&c=show&id=$'.$rname['{id}']; $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['search_page']) { $rule = $value['search_page']; $cname = "【".$r['name']."】模块搜索页(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{param}']) && !isset($rname['{rewrite}'])) { $error.= "".$cname."缺少{param}标签,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } $rule = 'index.php?s=$'.$rname['{modname}'].'&c=search&rewrite=$'.($rname['{param}'] ? $rname['{param}'] : $rname['{rewrite}']); $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['search']) { $rule = $value['search']; $cname = "【".$r['name']."】模块搜索页({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } else { if (!isset($rname['{modname}'])) { $rname['{modname}'] = '{modname}'; } $rule = 'index.php?s=$'.$rname['{modname}'].'&c=search'; $rule = str_replace('${modname}', '手动填写模块目录', $rule); if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } $code.= PHP_EOL.' // '.$r['name'].'---解析规则----结束'.PHP_EOL; } elseif ($r['type'] == 3 ) { // 共享栏目 $code.= PHP_EOL.' // '.$r['name'].'---解析规则----开始'.PHP_EOL; if ($value['list_page']) { $rule = $value['list_page']; $cname = "【".$r['name']."】模块栏目列表(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{page}'])) { $error.= "".$cname."缺少{page}标签,需要手动写解析规则
"; } elseif (!isset($rname['{dirname}']) && !isset($rname['{id}']) && !isset($rname['{pdirname}'])) { $error.= "".$cname."缺少{dirname}或{id}或{pdirname}标签,需要手动写解析规则
"; } else { if (isset($rname['{dirname}'])) { // 目录格式 $rule = 'index.php?c=category&dir=$'.$rname['{dirname}'].'&page=$'.$rname['{page}']; } elseif (isset($rname['{pdirname}'])) { // 层次目录格式 $rule = 'index.php?c=category&dir=$'.$rname['{pdirname}'].'&page=$'.$rname['{page}']; } else { // id模式 $rule = 'index.php?c=category&id=$'.$rname['{id}'].'&page=$'.$rname['{page}']; } if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['list']) { $rule = $value['list']; $cname = "【".$r['name']."】模块栏目列表({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{dirname}']) && !isset($rname['{id}']) && !isset($rname['{pdirname}'])) { $error.= "".$cname."缺少{dirname}或{id}或{pdirname}标签,需要手动写解析规则
"; } else { if (isset($rname['{dirname}'])) { // 目录格式 $rule = 'index.php?c=category&dir=$'.$rname['{dirname}']; } elseif (isset($rname['{pdirname}'])) { // 层次目录格式 $rule = 'index.php?c=category&dir=$'.$rname['{pdirname}']; } else { // id模式 $rule = 'index.php?c=category&id=$'.$rname['{id}']; } if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['show_page']) { $rule = $value['show_page']; $cname = "【".$r['name']."】模块内容页(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{page}'])) { $error.= "".$cname."缺少{page}标签,需要手动写解析规则
"; } elseif (!isset($rname['{id}'])) { $error.= "".$cname."缺少{id}标签,需要手动写解析规则
"; } else { $rule = 'index.php?c=show&id=$'.$rname['{id}'].'&page=$'.$rname['{page}']; if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['show']) { $rule = $value['show']; $cname = "【".$r['name']."】模块内容页({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{id}'])) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } else { $rule = 'index.php?c=show&id=$'.$rname['{id}']; if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } $code.= PHP_EOL.' // '.$r['name'].'---解析规则----结束'.PHP_EOL; } elseif ($r['type'] == 2 ) { // 共享模块 $code.= PHP_EOL.' // '.$r['name'].'---解析规则----开始'.PHP_EOL; if ($value['search_page']) { $rule = $value['search_page']; $cname = "【".$r['name']."】模块搜索页(分页)({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{modname}'])) { $error.= "".$cname."缺少{modname}标签,需要手动写解析规则
"; } elseif (!isset($rname['{param}'])) { $error.= "".$cname."缺少{param}标签,需要手动写解析规则
"; } else { $rule = 'index.php?s=$'.$rname['{modname}'].'&c=search&rewrite=$'.$rname['{param}']; if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } if ($value['search']) { $rule = $value['search']; $cname = "【".$r['name']."】模块搜索页({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{modname}'])) { $error.= "".$cname."缺少{modname}标签,需要手动写解析规则
"; } else { $rule = 'index.php?s=$'.$rname['{modname}'].'&c=search'; if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } $code.= PHP_EOL.' // '.$r['name'].'---解析规则----结束'.PHP_EOL; } elseif ($r['type'] == 4 ) { // 关键词库插件 $code.= PHP_EOL.' // '.$r['name'].'---解析规则----开始'.PHP_EOL; if ($value['tag']) { $rule = $value['tag']; $cname = "【".$r['name']."】TagURL({$rule})"; list($preg, $rname) = $this->_rule_preg_value($rule); if (!$preg || !$rname) { $error.= "".$cname."无法识别,需要手动写解析规则
"; } elseif (!isset($rname['{tag}'])) { $error.= "".$cname."缺少{tag}标签,需要手动写解析规则
"; } else { $rule = 'index.php?s=tag&name=$'.$rname['{tag}']; if (isset($write[$preg])) { $error.= "".$cname."与".$write[$preg]."规则存在冲突,需要手动写解析规则
"; } else { $write[$preg] = $cname; $code.= '"; } } } $code.= PHP_EOL.' // '.$r['name'].'---解析规则----结束'.PHP_EOL; } } return dr_return_data(1, dr_lang('生成成功'), [ 'code' => nl2br($code), 'error' => $error, ]); } // 正则解析 private function _rule_preg_value($rule) { $rule = trim(trim($rule, '/')); if (preg_match_all('/\{(.*)\}/U', $rule, $match)) { $value = []; foreach ($match[0] as $k => $v) { $value[$v] = ($k + 1); } $preg = preg_replace( [ '#\{id\}#U', '#\{uid\}#U', '#\{mid\}#U', '#\{fid\}#U', '#\{page\}#U', '#\{pdirname\}#Ui', '#\{dirname\}#Ui', '#\{opdirname\}#Ui', '#\{otdirname\}#Ui', '#\{modname\}#Ui', '#\{name\}#Ui', '#\{tag\}#U', '#\{param\}#U', '#\{rewrite\}#U', '#\{y\}#U', '#\{m\}#U', '#\{d\}#U', '#\{\.+}#U', '#/#' ], [ '([0-9]+)', '([0-9]+)', '(\d+)', '(\w+)', '([0-9]+)', '([\w\/]+)', '([A-za-z0-9 \-\_]+)', '([A-za-z0-9 \-\_]+)', '([A-za-z0-9 \-\_]+)', '([a-z]+)', '([a-z]+)', '(.+)', '(.+)', '(.+)', '([0-9]{4})', '([0-9]{2})', '([0-9]{2})', '(.+)', '\/' ], $rule ); // 替换特殊的结果 $preg = str_replace( ['(.+))}-', '.html'], ['(.+)-', '\.html'], $preg ); return [$preg, $value]; } return [$rule, []]; } }