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%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
Das liegt daran,
^
Anker bestätigt, dass wir am Anfang der Zeichenfolge \w
entspricht Buchstaben, Ziffern und dem Unterstrich $
Anker bestätigt, dass wir uns am Ende der Zeichenfolge In nginx können wir jedoch mit dem Operator ~
(Anfrage startet mit) den Anfangsanker ^
löschen. Du würdest so etwas schreiben:
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:
Referenz
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.