Saya tahu Anda selalu memikirkan cobaan dan kesengsaraan karena mengalami sukacita hidup sebagai proxy web. Jujur, siapa yang belum? Hari ini Anda ditugaskan untuk mewujudkan tujuan ini (setidaknya sebagian darinya). Situs web X mendapatkan banyak lalu lintas setiap hari dan mencari PaaS (jelas ini merujuk pada Proxy sebagai Layanan) karena sejumlah besar pengguna yang bersikeras meneruskan informasi sensitif melalui parameter kueri (pengguna konyol). Tugas Anda adalah menghapus sebagian dan semua parameter kueri sensitif dari permintaan sebelum meneruskan permintaan hingga ke tujuan awalnya.
Memasukkan
- URL HTTP absolut yang terbentuk dengan baik mengikuti tata bahasa URI di RFC3986 Bagian 3 .
- Anda dapat mengasumsikan tidak ada fragmen
- Contoh format singkat di mana apa pun dalam kurung siku menunjukkan opsional:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Daftar parameter kueri yang akan dihapus.
Keluaran
URL HTTP yang dimodifikasi tanpa parameter yang ditentukan dalam daftar input.
Contohnya
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:[email protected]:8080/?foo=1&bar=foo [foo]
> http://foo:[email protected]:8080/?bar=foo
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat (dalam byte) menang.
&
muncul di mana saja selain antar parameter??
? Juga haruskah pesanan tetap seperti itu?&
merupakan bagian dari parameter kueri, URL harus dimasukkan dengan benar sebagai%26
http://foo:&[email protected]:8080/?foo=1&bar=foo
diizinkan oleh RFC. Ini harus memecahkan banyak solusi yang ada. : D (Aturannya adalah userinfo dapat diperluas sebagai unreserved atau pct-escape atau sub-delims, dan sub-delims dapat memiliki&
dan=
)Jawaban:
GNU sed
98 96 88 80 77 74 69 59 54(48 +1 untuk -r) 49Daftar parameter untuk dihapus dipisahkan oleh spasi.
sumber
&
atau?
karakter di URL yang dihasilkan.JavaScript (ES6),
6260 byteSunting: Disimpan 2 byte berkat @Shaggy.
sumber
.href
di akhir.alert
atau gunakan masukkan ke dalam simpul (teks), seperti yang Anda miliki, itu akan memberi Andahref
properti objek. Jika Anda login ke konsol, itu akan memberi Anda objek lengkap. Lihat biola ini .PHP, 90 Bytes
-11 Bytes jika? atau & diizinkan di bagian akhir
Versi Sebelumnya 140 Bytes
sumber
^
/(.*|$)
akan menjadi bagian dari alternatif pertama / terakhir..*
. atau ganti(=.*|$)
dengan\b
(-5).#^foo|bar(=.*|$)#
yang identik dengan#(^foo)|(bar=.*|bar$))#
. Tapi seharusnya begitu#(foo|bar)(=.*|$)#
.array_map
(dan saya terkejut betapa pendeknya itu bisa berubah).PHP,
120110 bytedengan fungsi preg_replace dan array: (terinspirasi oleh Jörg )
simpan ke file, panggil dengan
php <scriptname> <uri> <parametername> <parametername> ...
dengan parse_str dan http_build_query (120 byte):
jalankan bersama
php -r <code> <uri> <parametername> <parametername> ...
sumber
parse_str
?http_build_query
? Saya sangat senang melihat seseorang bekerja menggunakan alat yang tepat untuk pekerjaan itu, bahkan dalam kode golf. Bug yang muncul karena URL / kueri SQL / regexp / HTML adalah "hanya string" yang jumlahnya banyak karena mudah dicegah.Java 7, 127 byte
Penjelasan
Ideone
sumber
C #,
377336330328 byte (173 alt)Program lengkap tidak digabungkan:
Mungkin tidak terlalu efisien, tetapi saya pikir itu berhasil.
Atau, ada solusi 173 byte menggunakan metode @ Poke dari Java. Membutuhkan impor untuk Regex, jadi mungkin tidak bisa lebih pendek.
sumber
Ruby,
146 140 127 119 116113 bytesunting 2: disimpan 6 byte dengan menggunakan
$1
,,$2
dan$*
, dan 7 dengan mengubahx.split("=")[0]
kex[/\w+/]
edit 3: disimpan 6 byte dengan menggunakan
*
alih-alih.join
, disimpan 2 byte dari ruang yang tidak perluedit 4: disimpan 3 byte dengan memformulasikan inline (ubah regex menjadi setara
$*[1][/([^?]*)\??(.*)/,1]
dan masukkan seperti yang ditugaskan padaa
)edit 5: disimpan 3 byte dengan menggunakan
($*[2].scan(r=/\w+/)&[x[r]])[0]
alih-alih$*[2].scan(r=/\w+/).include?(x[r])
Dengan asumsi input ke program saat menjalankannya:
Penjelasan
Ini mem-parsing URL yang diberikan pada baris perintah, dan menyimpan kecocokan ke dalam
$1
dan$2
.$*[1][/([^?]*)\??(.*)/,1]
juga mengembalikan pertandingan pertama untuk disimpan di dalama
, sedangkan pertandingan kedua disebut sebagai$2
membiarkan poin menjadi $ 1, dan menguraikanb
ke dalam array array ...... menolak semua itu ...
... punya string sebelum '=' yang termasuk dalam daftar nama yang diberikan oleh parameter kedua ... Ini berfungsi karena kita memindai kata-kata (untuk mendapatkan daftar) kemudian mendapatkan kata sebelum
=
, dan melihat apakah kata itu ada dalam daftar&
. Karena&
mengembalikan array kosong pada "not found" (set nol), kami menggunakan trik yang dijelaskan di bawah ini untuk mendapatkannil
jika tidak ada elemen dalam array. kalau tidak, kita mengembalikan string, yang dianggap benar, yang menolak string itu.... dan bergabung dengan string yang tersisa bersama dengan '&'
Pada titik ini,
b
dapatkan string kueri GET untuk URL. Jadi, kita hanya perlu mencetaknya.Ini menggunakan trik di ruby.
b[0]
akan menjadinil
jika b adalah array atau string kosong. Jadi jika truthy , (tidaknil
ataufalse
), maka ada setidaknya satu elemen dalam array, jadi kita perlu menempatkana+"?"+b
untuk URL yang benar. jika tidak, kami hanya menempatkana
, karena tidak ada parameter untuk ditampilkanCatatan: jawaban ini mengasumsikan bahwa
?
tidak dapat muncul di mana pun kecuali untuk membatasi URL dari kueri. (sesuai dengan apa yang saya baca dari RFC yang tertaut)Juga, ini jawaban golf pertama saya: D
sumber
Pip , 46 byte
Mengambil URL dari stdin dan parameter kueri untuk dihapus dari argumen baris perintah.
Cobalah online!
Penjelasan:
sumber
PowerShell v3 +,
11590 byteMengambil input
$n
sebagai URL dan$z
sebagai array string secara literal sebagai parameter untuk dihapus.-split
s pada input URL aktif?
, simpan bagian pertama masuk$a
dan kedua masuk$b
.Selanjutnya,
$b
dirumuskan ulang dengan mengambil loop melalui$z
, melakukan regex-replace
pada setiap kata permintaan yang dilarang untuk menghapusnya. Kemudian, output$a
(tidak dimodifikasi), ditambah/
tergantung pada apakah$b
ada, ditambah?
tergantung pada apakah$x
ada, ditambah `$ x.sumber
Pyth - 27 byte
Kenny benar ketika dia berbicara tentang builtin untuk diubah dan kemudian membalikkan, itu akan sangat sulit untuk diluruskan.
Test Suite .
sumber
Retina ,
4448 byteCrossed-out 44 masih 44. Terima kasih kepada Martin untuk perbaikannya.
Mengambil input seperti
uri param1 param2
. Cobalah online!Penjelasan
Penggantian pertama menghapus parameter yang sesuai dari string kueri.
[?&](?>([^ =&+))[^ &]*
cocok dengan?
atau&
, nama parameter lengkap, dan (opsional)=
dan nilai, menyimpan nama parameter dalam grup tangkap 1. Kemudian(?=.* \1( |$))
adalah lookahead yang memeriksa apakah nama parameter itu muncul dalam daftar parameter yang akan dihapus. Jika parameter cocok dengan kondisi ini, itu dihapus (diganti dengan pengganti kosong).Substitusi adalah non-tumpang tindih (terima kasih kepada lookahead) dan lanjutkan dari kiri ke kanan. Saat mencapai akhir URL,
.*
cabang cocok dengan daftar parameter untuk dihapus dan dihapus juga.Penggantian kedua hanya memastikan string kueri baru dimulai dengan
?
jika parameter pertama dihapus.sumber
(?>...)
.Java 7, 203 byte
Tidak Disatukan:
Fungsi ini melewati semua tes.
sumber
Python,
7581112 byte:Fungsi bernama. Mengambil input dalam format
dan menghasilkan string.
Repl.it Dengan Semua Kasus Uji!
sumber
PHP, tidak bersaing
Heck, PHP dibuat untuk ini; mengapa tidak menggunakan URL yang sebenarnya?
Simpan ke file, panggil dengan string kueri yang Anda inginkan plus
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Mungkin gagal pada nama pengguna dan kata sandi (tergantung apakah browser Anda menghapusnya atau tidak).
Akan gagal jika kata sandi
0
.sumber