2013-10-23 15 views
8

Qual è il modo più efficace per definire una direttiva posizione, che corrisponde qualcosa di simile
La maggior parte efficace espressione regolare per la posizione Nginx

location = /[0-9a-zA-Z_-]{1,6} { content_by_lua_file ....} 

In altre parole un URI, che corrisponde a una stringa da 1 a 6 caratteri con "- "," _ ", cifre e lettere.

O è più veloce di verificare la lunghezza della stringa nel mio codice LUA, che genererà l'output utilizzando una direttiva posizione come

location/{content_by_lua_file...} 

risposta

1

Penso che in Lua si dovrà verificare non solo la lunghezza , ma anche il contenuto della stringa.
Nginx utilizza la libreria C PCRE per le espressioni regolari.
C'è anche PCRE-JIT che JIT compila con espressioni regolari, particolarmente utile se l'espressione regolare è più complessa di quella nella tua domanda. Penso che in Nginx sia più veloce.

9

Le espressioni regolari sono molto efficienti in quello che fanno.

Quando l'attività è banale (ad esempio verifica la presenza di una stringa particolare), una funzione di stringa può essere più veloce di una regex, a seconda della piattaforma. Qui, stai controllando sia per un intervallo di caratteri che per una lunghezza. È improbabile che il codice Lua (compilato in fase di esecuzione) sia più veloce del codice C precompilato della libreria regex PCRE utilizzata da nginx.

In generale, l'espressione regolare per a string from 1 to 6 characters with "-", "_", digits and letters può essere scritta come

^[-\w]{1,6}$ 

Questo è dovuto al fatto

  • L'ancora ^ afferma che siamo all'inizio della stringa
  • La parola \w carattere corrisponde a lettere, cifre e il carattere di sottolineatura
  • $ ancoraggio afferma che siamo alla fine della stringa

Tuttavia, nel nginx, il ~ (richiesta inizia con) operatore ci permette di gettare l'ancora di iniziare ^. Si potrebbe scrivere qualcosa del genere:

location ~ [-\w]{1,6}$ { 
    # some rewrite code, for example 
    # rewrite ^([^/]+)/?$ /oldsite/$1 break; 
} 

Un altro boccone di informazioni per i curiosi: in Lua per sé, quanto sopra regex potrebbe essere trasformata in un modello di Lua, dove % viene utilizzato al posto di \ per formare metacaratteri:

^[-%w]{1,6}$ 

Riferimento

+0

questa è la risposta che avrei scritto +1 – bukart

Problemi correlati