'(\d+)', '{chapterid}' => '(\d+)', '{siteid}' => '(\d+)', '{key}' => '([a-zA-Z0-9_\-]+)', '{searchkey}' => '([^\?\/]+?)', '{novelid}' => '(\d+)', '{author}' => '([^\?\/]+?)', '{name}' => '([^\?\/]+?)', '{authorid}' => '(\d+)', '{pinyin}' => '([\w\-]+)', '{type}' => '([\w\-]+)', '{booklistid}' => '(\d+)', '{specialid}' => '(\d+)', ]; public static function format($param) { foreach ($param as &$v) { $v = '/' . ltrim($v, '/'); } return $param; } public static function createRouter($param) { $data = []; foreach ($param as $k => $v) { $v = ltrim($v, '/'); if ($v != '') { $rules = self::parseRule($v); if (strpos($v, '{') === false) { $position = 99; } else { $position = substr_count(explode('{', $v, 2)[0], '/') + 1; } foreach ($rules as $rule) { preg_match_all('/\{([a-z]+)\}/', $rule, $match); foreach ($match['0'] as $p) { $preg = empty(self::$rule[$p]) ? '([a-zA-Z0-9]+)' : self::$rule[$p]; $rule = str_replace($p, $preg, $rule); } $rule = rtrim($rule, '/'); $data[$position]["^{$rule}(\?(.*))*$"] = str_replace('.', '/', $k) . '?' . implode('&', $match[1]); } } } krsort($data); $result = []; foreach ($data as $value) { $result = array_merge($result, $value); } return $result; } public static function parseRule($rule) { preg_match_all('#\[[^\[\]]*?\{\w+\}[^\[\]]*?\]#', $rule, $match); $rules = [$rule]; if ($match['0']) { if (count($match['0']) == 1) { $rules[] = str_replace($match['0']['0'], '', $rule); } elseif (count($match['0'] == 2)) { $rules[] = str_replace($match['0']['0'], '', $rule); $rules[] = str_replace($match['0']['1'], '', $rule); $rules[] = str_replace([$match['0']['0'], $match['0']['1']], '', $rule); } elseif (count($match['0'] == 3)) { $rules[] = str_replace($match['0']['0'], '', $rule); $rules[] = str_replace($match['0']['1'], '', $rule); $rules[] = str_replace($match['0']['2'], '', $rule); $rules[] = str_replace([$match['0']['0'], $match['0']['1']], '', $rule); $rules[] = str_replace([$match['0']['0'], $match['0']['2']], '', $rule); $rules[] = str_replace([$match['0']['1'], $match['0']['2']], '', $rule); $rules[] = str_replace([$match['0']['0'], $match['0']['1'], $match['0']['2']], '', $rule); } foreach ($rules as &$v) { $v = str_replace(['[', ']'], '', $v); } } return $rules; } public static function iisRule($param) { $data = "[ISAPI_Rewrite]\r\n\r\nCacheClockRate 3600\r\nRepeatLimit 32\r\n"; foreach ($param as $k => $v) { $v = ltrim($v, '/'); if ($v != '') { $param = []; preg_match_all('/\{([a-z]+)\}/', $v, $match); $n = 1; foreach ($match['0'] as $kk => $vv) { $preg = empty(self::$rule[$vv]) ? '([a-zA-Z0-9]+)' : self::$rule[$vv]; $v = str_replace($vv, $preg, $v); ++$n; $param[] = "{$match['1'][$kk]}=$" . $n; } $data .= "RewriteRule ^(.*)/{$v}(\?(.*))*$ $1/index.php\?s=" . str_replace([ '.', '_', ], '/', $k) . '&' . implode('&', $param) . '&$' . ($n + 2) . " [I]\r\n"; } } return trim($data); } }