Der effizienteste reguläre Ausdruck für den Nginx-Speicherort

8

Was ist der effizienteste Weg, um eine Location-Direktive zu definieren, die etwas wie zB

entspricht? %Vor%

Mit anderen Worten ein URI, der einer Zeichenkette von 1 bis 6 Zeichen mit "-", "_", Ziffern und Buchstaben entspricht.

Oder ist es schneller, die String-Länge innerhalb meines LUA-Codes zu überprüfen, wodurch die Ausgabe erzeugt wird, indem eine Location-Direktive wie zB

verwendet wird %Vor%     
user1606908 23.10.2013, 20:07
quelle

2 Antworten

9

Reguläre Ausdrücke sind sehr effizient bei dem, was sie tun.

Wenn die Aufgabe trivial ist (z. B. das Vorhandensein einer bestimmten Zeichenfolge prüfen), kann eine Zeichenfolgenfunktion schneller als eine reguläre Zeichenfolge sein - abhängig von der Plattform. Hier prüfen Sie sowohl den Zeichenbereich als auch die Länge. Es ist unwahrscheinlich, dass Lua-Code (zur Laufzeit kompiliert) schneller ist als der vorkompilierte C-Code der PCRE-Regex-Bibliothek, die von nginx verwendet wird.

Im Allgemeinen kann die Regex für a string from 1 to 6 characters with "-", "_", digits and letters als

geschrieben werden %Vor%

Das liegt daran,

  • Der ^ Anker bestätigt, dass wir am Anfang der Zeichenfolge
  • stehen
  • Das Wort \w entspricht Buchstaben, Ziffern und dem Unterstrich
  • Der $ Anker bestätigt, dass wir uns am Ende der Zeichenfolge
  • befinden

In nginx können wir jedoch mit dem Operator ~ (Anfrage startet mit) den Anfangsanker ^ löschen. Du würdest so etwas schreiben:

%Vor%

Noch ein Bissen Information für Neugierige: In Lua selbst könnte die obige Regex in ein Lua-Muster umgewandelt werden, wobei % anstelle von \ verwendet wird, um Metazeichen zu bilden:

%Vor%

Referenz

zx81 25.07.2014 23:09
quelle
1

Ich denke, dass Sie in Lua nicht nur die Länge, sondern auch den Inhalt der Saite überprüfen müssen Nginx verwendet die C-Bibliothek PCRE für reguläre Ausdrücke.
Es gibt auch PCRE-JIT, das JIT regulären Ausdruck zusammensetzt, besonders nützlich, wenn der reguläre Ausdruck komplexer als der in Ihrer Frage ist. Ich denke, in Nginx ist es schneller.

    
Rhim 25.07.2014 22:51
quelle

Tags und Links