Expression régulière pour correspondre à plusieurs paires paramètre/valeur de chaîne de requête

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

  •  23-08-2019
  •  | 
  •  

Question

Je suis sur le point de résoudre celui-ci, mais je pensais que quelqu'un avait peut-être déjà dû s'y attaquer, alors...

Je recherche une expression régulière élégante (et compatible avec la réécriture isapi) pour rechercher trois paires paramètre/valeur connues dans une chaîne de requête, quel que soit l'ordre, et également extraire tous les autres paramètres tout en supprimant ces trois.

abc=123 déf = 456 et ghi=789 sont toutes des chaînes fixes connues.Ils peuvent apparaître dans n'importe quel ordre dans la chaîne de requête, et peuvent ou non être les seuls paramètres, peuvent ou non être adjacents.Il doit être intelligent et ne pas correspondre à unABC=123 ou abc=1234 (chaque paramètre recherché doit donc être entouré de &, ?, # ou fin de chaîne).Le résultat que je souhaite est une nouvelle chaîne de requête avec les paramètres restants supprimés.

Je vais probablement essayer la logique dans la matinée, donc des points bonus si vous pouvez le résoudre avant que j'essaye de le faire.

Pas de solution correcte

Autres conseils

Je pense que les expressions rationnelles ne doivent pas être utilisés pour des problèmes de ce type. Juste tokenizer la chaîne, et de comparer le nom de chaque paramètre à ce que vous recherchez.

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

est approximative et non testé, mais présente un travail (je pense) concept. Fondamentalement, chercher la frontière de départ, chaîne littérale, alors fin frontière, remplaçant chacun nulle, au niveau mondial, et en utilisant | pour donner d'autres options pour chacun.

Voici ce que j'ai trouvé :

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]

ce qui, je pense, fonctionne.les qualificatifs lookAhead/lookbehind, (?<= et (?= , semblent être la clé pour me permettre de rechercher le & ou ?sans le « consommer » pour gâcher le prochain match.

Un problème est que si l'URL de l'ancienne page ne contient que les trois paramètres, je me retrouve toujours avec un ?sans paramètres sur l'URL redirigée, "/newpage.htm?".Je prévois actuellement d'éviter cela en utilisant un RewriteCond pour examiner uniquement les URL avec plus de 4 paramètres avant que cela ne se déclenche, et d'avoir une expression régulière de correspondance plus simple pour celles qui en contiennent exactement trois.

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]

(le 1 $ à la fin est destiné aux #ajouts à l'URL... en ai-je vraiment besoin ?) L'autre problème est que je suppose qu'une URL de /oldpage.htm?abc=123&abc=123&abc=123 déclencherait cela, mais je je ne vois pas de solution simple à ce problème et cela ne m'inquiète pas trop.

Quelqu'un peut-il penser à une meilleure façon d'aborder cela ou voir d'autres problèmes ?

Il y a des décodeurs queryString. Il y a beaucoup de sujets connexes, en particulier sur ce site.

Certains d'entre eux.

Première

Deuxième

lien pour le décodeur apache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top