2 Stimmen

PHP Großbuchstaben zu Kleinbuchstaben umschreiben Optimierung?

Ich verwende diesen PHP-Code, um jede Form von UPPERCASE in URIs auf Kleinbuchstaben umzuleiten. Es gibt drei Ausnahmen: Wenn der URI entweder "adminpanel" oder "search" enthält, gibt es keine Umleitung, auch wenn er bereits klein geschrieben ist, gibt es keine Umleitung

Sehen Sie eine Möglichkeit, diese Funktion in PHP zu verbessern?

$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;
}

2voto

jkndrkn Punkte 3940

Ich denke, dies wird nicht umleiten, wenn ein URI gemischte Groß- und Kleinschreibung hat. Ist dies beabsichtigt? Könnte die Verwendung des String-Vergleichs von $trailed und strtolower($trailed) auch weniger ausführlich sein als die Verwendung eines regulären Ausdrucks in der dritten Klausel der if-Anweisung in Zeile 4?

2voto

VolkerK Punkte 93746

Anstatt die ursprüngliche Zeichenkette und das Ergebnis von preg_replace() zu vergleichen, könnte man preg_match() testen lassen, ob ein Großbuchstabe in der Zeichenkette enthalten ist.

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

(Das mag jetzt nicht relevant sein, aber als Nebenbemerkung: pcre hat eine gewisse Unicode-Unterstützung. Anstelle von [:upper:] würden Sie verwenden \p {Lu} zur Prüfung auf Unicode-Großbuchstaben, siehe http://www.pcre.org/pcre.txt )

2voto

Lukas Punkte 409
$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;
}

Bei einem kombinierten Ansatz ist dieser Code etwa 140 % schneller als der erste. Nur eine if-Anweisung mit der strpos innerhalb und ein preg_match anstelle von String-Längenvergleich.

Es tut mir leid, dass ich noch nicht das Ansehen habe, um die Antworten zu bewerten, die zur endgültigen Version geführt haben, und ich danke euch sehr für eure Hilfe :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X