ho attualmente il lavoro Mod Rewrite Regex:Mod Rewrite Regex - Più Lookaheads negativi
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]
Che regex prende il seguente URL e la trasforma in l'URL immediatamente sotto:
www.site.com/cmd1/param/cmd2/param2/stillparam2
e di trasformarlo in www.site.com/index.php?cmd1=param&cmd2=param2/stillparam2
che funziona bene, ma vorrei anche creare un altro asserzione lookahead negativo per garantire che un blocco di URL - vale a dire un param /texthere/
- non include un carattere di sottolineatura. Potrebbe apparire una stringa non valida: www.test.com/cmd/thing/getparam_valuehere
; la regex dovrebbe analizzare lo cmd/thing
come coppia chiave e valore e ignorare il resto della stringa. Poi scriverò anche un altro RewriteRule per avere il blocco dell'URL con il trattino basso in esso aggiunto come un altro parametro URL. La seguente traduzione URL sarebbe verificato:
www.test.com/cmd/param1/cmd2/directory/param2/sortorder_5
www.test.com?cmd=param1&cmd2=directory/param2&sortorder=5
Si prega di farmi sapere se non sono stato abbastanza chiaro. Qualsiasi aiuto sarebbe grande.
NB: Ho provato con un lookahead negativo annidato all'interno di quello già presente - (?!(?!))
- e provato con un |
su due lookaheads negativi, ma né soluzioni lavorato. Ho pensato che forse qualcos'altro era fondamentalmente sbagliato?
Grazie a tutti.
Edit: Ho anche provato il seguente - che ho davvero pensato avrebbe funzionato (ma ovviamente, non ha!)
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(?![.+]*(?:_)[.+]*)(.+)) $1?$2=$3&%1 [L]
che fa la seguente:
www.test.com/cmd/param1/sortorder_1/
traduce in www.test.com?cmd=param1/sortorder_1/
Quando invece dovrebbe diventare: www.test.com?cmd=param1&sortorder=2/
. La regola per tradurre /sortorder_2/
in &sortorder=2
non è stata ancora creata, ma si può sperare di vedere cosa intendo).
_Lookbehinds_ deve essere di lunghezza costante, i lookahead di lunghezza variabile devono essere OK. – MRAB
Sì, sicuramente qui vengono utilizzati solo lookahead negativi. Grazie per la risposta! – Pete171
Ho anche provato quanto segue: 'RewriteRule^(. * /)? ((?: cmd) [^ /] *)/((?! (?: [A-Za-z0-9]) * _ + (?: [A-Za-z0-9]) *) (. +)) $ 1? $ 2 = $ 3 e% 1 [L] '. Qui, ho rimosso il lookahead negativo (funzionante) originale e l'ho sostituito con un altro che dovrebbe garantire che un trattino basso non sia presente in un blocco URL prima di includerlo come parte di un parametro. Questo non ha funzionato e ha generato la seguente stringa di query: 'cmd = chiave/to/comando/valore_qui/sortorder_5 /' Era mia intenzione fermarsi a '/ value_here /' in modo da poter convalidare lookahead negativo trova il segmento di sottolineatura correttamente. Senza fortuna. – Pete171