2017-02-06 6 views
0

Je suis à la recherche d'une expression regualr correcte pour valider les chaînes de requête URI. J'ai trouvé quelques réponses here ou here mais j'ai encore des doutes sur les cas de bords, où la clé ou la valeur pourrait être vide. Par exemple, les éléments suivants doivent-ils être traités comme des chaînes de requête valides?Chaîne de requête cas dégénérés

?&& 
?= 
?a= 
?a=& 
?=a 
?&=a 

Répondre

1

Je suis à la recherche [...] pour une expression régulière correcte pour [valide] chaînes de requête URI.

Bien sûr, pas de problème. Comme par RFC 3986, appendix B, la voici:

^([^#]*)$ 

Si vous voulez quelque chose de plus complexe, vous pouvez vérifier section 3.4 pour les caractères autorisés en plus des entités codées pour cent. La regex ressemblerait à ceci:

^(%[[:xdigit:]]{2}|[[:print:]])*$ 

En ce qui concerne la RFC 3986, tous vos exemples sont valables jusqu'à présent. Le RFC nous dit comment la chaîne de requête doit être codé tout en disant peu sur la façon dont la chaîne de requête doit être structuré. Les RFC plus anciennes transfèrent continuellement l'autorité sur la structure des chaînes de requête entre CGI et HTTP sans jamais spécifier formellement une grammaire (voir par exemple RFC 3875, sec. 4.1.7, RFC 2396, sec. 3.4, RFC 1808, sec. 2.1, & hellip;).

Une note intéressante se trouve dans RFC 7230, section 2.4:

Applications NE DOIVENT PAS spécifier directement la syntaxe des requêtes, car cela peut causer des difficultés opérationnelles pour les déploiements qui ne supportent pas une forme particulière d'une requête. [& hellip;] HTML contraint la syntaxe des chaînes de requête utilisées dans la soumission de formulaire. Nouvelles langues de forme ne devrait l'imiter, mais plutôt permettre la création d'une variété plus large de URIs

Pour une vérification de validité complète sur ces chaînes de requête, vous devez mettre en œuvre le algorithm for decoding formdata recommandé par le W3C. Pourrait être fait en regex, mais je déconseille pour des raisons de santé mentale.

En ce qui concerne vos exemples: Je crois qu'ils sont tous valables. La manière dont ils sont interprétés devrait être laissée à l'application réceptrice. Certains ne sont pas autant d'un cas marginal que vous pouvez penser, cependant: ?&& est simplement un dictionnaire vide tandis que ?=a pourrait correspondre à { "": "a" }.

+0

Une future norme prometteuse [ici] (https://url.spec.whatwg.org/#application/x-www-form-urlencoded) ... –