Un'espressione regolare per trovare più coppie parametro / valore della stringa di query

StackOverflow https://stackoverflow.com/questions/895279

  •  23-08-2019
  •  | 
  •  

Domanda

A proposito di lavorare attraverso questo, ma ho pensato che qualcuno potrebbe avere già dovuto affrontare il problema, in modo da ...

Sto cercando un elegante (e ISAPI riscrivere compatibile) espressione regolare per cercare tre note coppie parametro / valore in una querystring, indipendentemente dall'ordine, e anche estrarre tutti gli altri parametri, mentre escludendo quei tre.

abc = 123 def = 456 e ghi = 789 sono tutti noti, stringhe fisse. Essi possono apparire in qualsiasi ordine nella querystring, e possono o non possono essere gli unici parametri, possono o non possono essere adiacenti. Dovrebbe essere intelligente e non corrispondere ad un AABC = 123 o abc = 123 4 (così ogni cercato parametro deve essere tra parentesi da &,?, #, O alla fine della stringa) . L'output che voglio è una nuova stringa di query con i restanti params spogliato fuori.

Io probabilmente essere prendendo una pugnalata alla logica del mattino, in modo da punti bonus se si riesce a risolvere prima cerco di allora.

Nessuna soluzione corretta

Altri suggerimenti

Credo regex non devono essere utilizzati per problemi di questo tipo. Basta tokenize la stringa e confronta il nome di tutti i parametri di ciò che si sta cercando.

s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g

Questa è approssimativo e non testato, ma presenta un concetto di lavoro (credo). Fondamentalmente, cercare partendo confine, stringa letterale, quindi terminare confine, sostituendo ogni con null, globalmente, e utilizzando | per dare opzioni alternative per ciascuno.

Ecco cosa mi è venuta in mente:

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

che credo opere. Il lookahead / lookbehind qualificazioni, (? <= e (? =, sembrano essere la chiave per che mi permette di cercare il che comprende & o? senza "consumarlo" per rovinare la prossima partita.

Un punto è che se la pagina vecchia url ha solo tre params, ho ancora finire con un finale? senza parametri sulla URL di reindirizzamento, "/newpage.htm?". Attualmente sto progettando di evitare che utilizzando un RewriteCond a guardare solo gli URL con 4+ params davanti a questo fuoco, e hanno un match regex più semplice per i più esattamente three..so il set di regole completo esce a:

RewriteCond URL ^/oldpage.htm\?([^#]\*=[^#]\*&){3,}[^#]\*=[^#]\*.\*

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

RewriteRule ^/oldpage.htm\?(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)(.\*) /newpage.htm$1 [I,RP,L]

($ 1 alla fine è per #additions per l'url ... ne ho veramente bisogno?) L'altra questione è suppongo un URL di /oldpage.htm?abc=123&abc=123&abc=123 innescherebbe questo , ma non vedo un modo semplice intorno a quella, e non sono troppo preoccupato ..

Qualcuno può pensare a un modo migliore per avvicinarsi a questo, oppure consultare tutte le altre questioni?

Ci sono decodificatori querystring. Ci sono molti argomenti connessi, in particolare su questo sito.

Alcuni di loro.

Primo

Seconda

E javadocs link per decoder apache.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top