2

我正在使用此 PHP 代码将 URI 中任何形式的大写字母重定向为小写字母。有三个例外:如果 URI 包含“adminpanel”或“search”,则没有重定向,如果它已经是小写,则没有重定向

你有什么方法可以改进 PHP 中的功能吗?

$trailed = $_SERVER['REQUEST_URI'];
$pos1 = strpos($trailed,"adminpanel");
$pos2 = strpos($trailed,"search");
if ($pos1 === false && $pos2 === false && strlen($trailed) !== strlen(preg_replace('/[A-Z]/', '',     $trailed))) {
    $trailed = strtolower($trailed);
    header('HTTP/1.1 301 Moved Permanently'); 
    header('Location: http://'. $_SERVER["SERVER_NAME"] . $trailed);
    exit;
}
4

3 回答 3

2

我认为如果 URI 大小写混合,这将无法重定向。这是故意的吗?此外,使用 $trailed 和 strtolower($trailed) 的字符串比较是否比在第 4 行的 if 语句的第三个子句中使用正则表达式更简洁?

于 2009-12-07T19:37:20.520 回答
2

如果字符串中有大写字母,您可以让 preg_match() 测试,而不是比较原始字符串和 preg_replace() 的结果。

if ( preg_match('/[[:upper:]]/', $_SERVER['REQUEST_URI']) ) {
  if ( false===stripos($trailed, 'adminpanel') && false===stripos($trailed, 'search') {
    // strotolower
    // ...
  }
}

(这现在可能不相关,但作为旁注:pcre 有一些 unicode 支持。而不是 [:upper:] 您可以使用 \p{Lu} 来测试 unicode 大写字母,请参阅http://www。 pcre.org/pcre.txt )

于 2009-12-07T19:49:05.523 回答
2
$trailed = $_SERVER['REQUEST_URI'];
if (!strpos($trailed,"admin") && !strpos($trailed,"search") && preg_match('/[[:upper:]]/', $trailed)) {
  $trailed = strtolower($trailed);
  header('HTTP/1.1 301 Moved Permanently'); 
  header('Location: http://'. $_SERVER["SERVER_NAME"] . $trailed);
  exit;
}

采用组合方法,此代码比第一个代码快 140%。只有一个带有 strpos 的 if 语句和 preg_match 而不是字符串长度比较。

抱歉,我还没有声望对最终版本的答案进行投票,非常感谢您的帮助:)

于 2009-12-07T21:23:05.263 回答