2

この PHP コードを使用して、URI の任意の形式の大文字を小文字にリダイレクトしています。3 つの例外があります。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 ステートメントの 3 番目の句で正規表現を使用するよりも冗長ではないでしょうか?

于 2009-12-07T19:37:20.520 に答える
2

元の文字列と preg_replace() の結果を比較する代わりに、文字列に大文字が含まれているかどうかを preg_match() にテストさせることができます。

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 ステートメントが 1 つだけあり、文字列の長さの比較の代わりに preg_match が使用されます。

申し訳ありませんが、私はまだ最終バージョンにつながる回答を投票する評判がありません。ご協力いただきありがとうございます:)

于 2009-12-07T21:23:05.263 に答える