Запрос строки вырожденных случаев
Я ищу в поисках правильного выражения Regualr для проверки строк запроса URI. Я нашел некоторые ответы здесь или здесь, но у меня все еще есть сомнения в крайних случаях, когда ключ или значение могут быть пустыми. Например, следует ли рассматривать следующие строки как допустимые строки запроса?
?&&
?=
?a=
?a=&
?=a
?&=a
1 ответ
Я ищу [...] правильное регулярное выражение для [допустимых] строк запроса URI.
Конечно, нет проблем. Согласно RFC 3986, приложение B, вот оно:
^([^#]*)$
Если вы хотите что-то более сложное, вы можете проверить раздел 3.4 на наличие разрешенных символов в дополнение к кодированным в процентах объектам. Регулярное выражение будет выглядеть примерно так:
^(%[[:xdigit:]]{2}|[[:print:]])*$
Что касается RFC 3986, то все ваши примеры пока действительны. RFC говорит нам, как должна быть закодирована строка запроса, и мало говорит о том, как должна быть структурирована строка запроса. Старые RFC непрерывно смещают авторитет в структуре строк запросов между CGI и HTTP, даже не задавая формальную грамматику (см., Например, RFC 3875, с. 4.1.7, RFC 2396, с. 3.4, RFC 1808, с. 2.1,…),
Интересное примечание можно найти в RFC 7230, раздел 2.4:
Приложения НЕ ДОЛЖНЫ напрямую указывать синтаксис запросов, поскольку это может вызвать эксплуатационные трудности для развертываний, которые не поддерживают конкретную форму запроса. […] HTML ограничивает синтаксис строк запроса, используемых при отправке формы. Новые языки форм НЕ ДОЛЖНЫ имитировать его, а вместо этого позволяют создавать более широкий спектр URI
Для полной проверки достоверности таких строк запроса вы должны будете реализовать алгоритм декодирования данных форм, рекомендованный W3C. Может быть сделано в регулярных выражениях, но я бы советовал против этого по соображениям здравомыслия.
Что касается ваших примеров: я считаю, что все они действительны. Как они интерпретируются, следует оставить на усмотрение получателя. Однако некоторые из них не настолько сложны, как вы думаете: ?&&
это просто пустой словарь в то время как ?=a
может сопоставить с { "": "a" }
,