Я знаю, что вы всегда думали об испытаниях и невзгодах переживания радостей жизни в качестве веб-прокси. Честно говоря, у кого нет? Сегодня вам поручено реализовать эту цель (по крайней мере, ее часть). Сайт X ежедневно получает большой трафик и ищет PaaS (очевидно, это относится к Proxy как услуге) из-за большого количества пользователей, которые настаивают на передаче конфиденциальной информации через параметры запроса (пользователи глупы). Ваша задача состоит в том, чтобы удалить все и все важные параметры запроса из запроса, прежде чем перенаправить запрос в его исходное место назначения.
вход
- Правильно сформированный абсолютный URL-адрес HTTP, который следует грамматике URI в Разделе 3 RFC3986 .
- Вы можете предположить, что нет фрагмента
- Краткий пример формата, где все в квадратных скобках обозначает необязательный:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Список параметров запроса для удаления.
Выход
Измененный URL-адрес HTTP без параметров, определенных в списке ввода.
Примеры
http://example.com/ [foo]
> http://example.com/
http://example.com/?foo=bar []
> http://example.com/?foo=bar
http://example.com/ []
> http://example.com/
http://example.com/?foo=1&bar=2&baz=3 [foo,baz]
> http://example.com/?bar=2
http://example.com/?foo=1&bar=2&baz=3 [foo,bar,baz]
> http://example.com/
http://example.com/?foo&bar=2&baz= [foo,baz]
> http://example.com/?bar=2
http://example.com/?abc=1&def=2&baz=foo [foo,bar]
> http://example.com/?abc=1&def=2&baz=foo
http://example.com/?foobar=baz [foo]
> http://example.com/?foobar=baz
http://foo:foo@foo.com:8080/?foo=1&bar=foo [foo]
> http://foo:foo@foo.com:8080/?bar=foo
счет
Это код-гольф , поэтому выигрывает самый короткий ответ (в байтах).
&
появиться где-нибудь, кроме между параметрами??
? Также должен ли порядок быть таким же, как был?&
это часть параметра запроса, он должен быть правильно закодирован как%26
http://foo:&foo=x@foo.com:8080/?foo=1&bar=foo
это разрешено RFC. Это должно сломать кучу существующих решений. : D (Правило userinfo может быть расширено как незарезервированное или pct-escape или вложенные разделы, и вложенные разделы могут иметь&
и=
)Ответы:
GNU sed
98 96 88 80 77 74 69 59 54(48 + 1 для -r) 49Список удаляемых параметров разделен пробелами.
источник
&
или?
символ в результирующем URL.JavaScript (ES6),
6260 байтРедактировать: 2 байта сохранены благодаря @Shaggy.
источник
.href
в конце.alert
это или используете, вставляете его в (текстовый) узел, как у вас, это даст вамhref
свойство объекта. Если вы войдете в консоль, он даст вам полный объект. Посмотри на эту скрипку .PHP, 90 байт
-11 байт если? или & допускается в конце
Предыдущая версия 140 байт
источник
^
/(.*|$)
будут частью первой / последней альтернативы..*
. или заменить(=.*|$)
на\b
(-5).#^foo|bar(=.*|$)#
же, как и#(^foo)|(bar=.*|bar$))#
. Но так и должно быть#(foo|bar)(=.*|$)#
.array_map
(и я был удивлен, насколько коротким может оказаться).PHP,
120110 байтс функциями preg_replace и array: (вдохновлено Йоргом )
сохранить в файл, позвонить с
php <scriptname> <uri> <parametername> <parametername> ...
с parse_str и http_build_query (120 байт):
бежать с
php -r <code> <uri> <parametername> <parametername> ...
источник
parse_str
?http_build_query
? Я так рад, что кто-то работает, используя правильные инструменты для работы, даже в гольф-коде. Ошибки, возникающие из-за того, что URL / SQL-запрос / регулярное выражение / HTML являются «просто строками», настолько многочисленны, насколько их легко предотвратить.Java 7, 127 байт
объяснение
Ideone
источник
C #,
377336330328 байтов (173 альт)Развёрнутая полная программа:
Вероятно, не очень эффективно, но я думаю, что это работает.
Кроме того, существует 173-байтовое решение с использованием метода @ Poke из Java. Требуется импорт для Regex, поэтому, вероятно, не может быть короче.
источник
Рубин,
146 140 127 119 116113 байтовизменить 2: сохранить 6 байтов, используя
$1
,$2
и$*
, и 7, изменивx.split("=")[0]
дляx[/\w+/]
редактирования 3: сохранить 6 байтов, используя
*
вместо.join
, сохраненные 2 байта из ненужных пробелов.редактировать 4: сохранить 3 байта, переформулировав inline (изменив регулярное выражение на эквивалентное
$*[1][/([^?]*)\??(.*)/,1]
и поместив как назначеноa
)редактировать 5: сохранено 3 байта с использованием
($*[2].scan(r=/\w+/)&[x[r]])[0]
вместо$*[2].scan(r=/\w+/).include?(x[r])
Предполагая ввод в программу при ее запуске:
объяснение
Это анализирует URL-адрес, указанный в командной строке, и сохраняет совпадения в
$1
и$2
.$*[1][/([^?]*)\??(.*)/,1]
также возвращает первое совпадение для хранения внутриa
, в то время как второе совпадение называется разрешением$2
точки до $ 1 и анализомb
массива массивов ...... отвергая все это ...
... иметь строку перед '=', которая включена в список имен, заданный вторым параметром ... Это работает, потому что мы сканируем слова (чтобы получить список), затем получаем слово перед
=
, и видим, это слово в списке с&
. Поскольку&
возвращает пустой массив для «not found» (нулевой набор), мы используем прием, описанный ниже, чтобы получить,nil
если в массиве нет элементов. в противном случае мы возвращаем строку, которая считается истинной, которая отклоняет эту строку.... и соединить оставшиеся строки вместе с '&'
На данный момент
b
это строка запроса GET для URL. Таким образом, нам просто нужно распечатать его.Это использует трюк в рубине.
b[0]
будет,nil
если b пустой массив или строка. Так что если это правда , (неnil
илиfalse
), то в массиве есть хотя бы один элемент, поэтому нам нужно указатьa+"?"+b
правильный URL. в противном случае мы просто помещаемa
, потому что нет параметров для отображенияПримечание. В этом ответе предполагается, что он
?
не может появляться нигде, кроме как для разграничения URL-адреса из запроса (согласно тому, что я прочитал из связанного RFC)Кроме того, это мой первый ответ гольф: D
источник
Пип , 46 байт
Принимает URL из stdin и параметры запроса для удаления из аргументов командной строки.
Попробуйте онлайн!
Объяснение:
источник
PowerShell v3 +,
11590 байтПринимает входные данные
$n
как URL и$z
как буквенный массив строк в качестве параметров для удаления.-split
s входной URL включен?
, первая половина сохраняется,$a
а вторая - в$b
.Далее,
$b
переформулируется путем выполнения цикла$z
, выполняя регулярные выражения-replace
для каждого забаненного слова запроса, чтобы удалить их. Затем выходные данные$a
(неизмененные), плюс a в/
зависимости от того,$b
существует ли , плюс a в?
зависимости от того,$x
существует ли , плюс `$ x.источник
Pyth - 27 байт
Кенни был прав, когда говорил о встроенном преобразовании, а затем об обратном, однако это будет очень трудно исправить.
Тестовый пакет .
источник
Retina ,
4448 байтВычеркнутый 44 - все еще 44. Спасибо Мартину за исправление.
Принимает участие как
uri param1 param2
. Попробуйте онлайн!объяснение
Первая замена удаляет соответствующие параметры из строки запроса.
[?&](?>([^ =&+))[^ &]*
Соответствует?
или&
, полному имени параметра и (необязательно)=
и значению, сохраняя имя параметра в группе захвата 1. Затем(?=.* \1( |$))
выполняется предварительный просмотр, который проверяет, появляется ли это имя параметра в списке параметров для удаления. Если параметр соответствует этим условиям, он удаляется (заменяется пустой заменой).Замены не перекрываются (благодаря прогнозу) и продолжаются слева направо. По достижении конца URL
.*
ветвь сопоставляет список параметров для удаления и удаляет его.Вторая замена просто гарантирует, что новая строка запроса начинается,
?
если первый параметр был удален.источник
(?>...)
.Java 7, 203 байта
Ungolfed:
Эта функция проходит все тесты.
источник
Python,
7581112 байт:Именованная функция. Принимает ввод в формате
и выводит строку.
Repl.it со всеми тестовыми примерами!
источник
PHP, не конкурирующий
Черт, PHP был создан для этого; почему бы не использовать реальный URL?
Сохраните в файл, позвоните с нужной вам строкой запроса плюс
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Может произойти сбой при вводе имени пользователя и пароля (в зависимости от того, удаляет их браузер или нет).
Будет ошибкой , если пароль
0
.источник