Оптимизация перезаписи прописных букв в PHP? - PullRequest
2 голосов
/ 07 декабря 2009

Я использую этот код PHP для перенаправления любой формы UPPERCASE в 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;
}

Ответы [ 3 ]

2 голосов
/ 07 декабря 2009

Вместо сравнения исходной строки и результата preg_replace () вы можете разрешить тест preg_match (), если в строке есть заглавная буква.

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

(Это может быть неактуально сейчас, но как примечание: у pcre есть некоторая поддержка юникода. Вместо [: upper:] вы использовали бы \ p {Lu} для проверки на заглавные буквы юникода, см. http://www.pcre.org/pcre.txt)

2 голосов
/ 08 декабря 2009
$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% быстрее, чем первый. Только один оператор if со строками внутри и preg_match вместо сравнения длины строки.

Извините, у меня еще нет репутации, чтобы голосовать за ответы, которые приведут к окончательной версии, и большое спасибо за вашу помощь:)

2 голосов
/ 07 декабря 2009

Я думаю, что это не удастся перенаправить в случае, если URI имеет смешанный регистр. Это предназначено? Кроме того, может ли сравнение строк $ trailed и strtolower ($ trailed) быть менее многословным, чем использование регулярного выражения в третьем предложении оператора if в строке 4?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...