Parsování URL query pomocí regulárního výrazu

Palecek.x

Parsování URL query pomocí regulárního výrazu
« kdy: 06. 10. 2018, 10:57:16 »
zdravím vespolek,

pomohl by mi prosím někdo z vás se setavením nebo návodem na sestavení reg. výrazu, který by uměl zpracovat něco takového ?


user_firstname=Vaclav&user_surname=Havel&_user_city=Praha


zkoušel jsem jen tak pro matchnutí prvního přířazení:


^(\w+)=(\w*)


s výsledkem:


Match 1

Full match 0-21 `user_firstname=Vaclav`

Group 1. 0-14 `user_firstname`
Group 2. 15-21 `Vaclav`


nicméně by mě zajímalo (protože nechci spoléhat na to, že vždycky budou tři přiřazení viz query) zda-li regulární výrazy podporují proměnlivý počet toho, co jsem se pokusil sestavit. V tomto případě bych chtěl mít 6 group. A například pokud pribude datum narození tak 8.

jde pls takový regulární sestavit nebo se snažím o něco co není podporované?


regex

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #1 kdy: 06. 10. 2018, 11:55:01 »
Co neco takoveho http://codepad.org/71ykiwHs?

mikrom

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #2 kdy: 06. 10. 2018, 12:37:22 »
a v akomjazyku to robis ?

Retazec sa da pokrajat cez separator & do pola  / funkcia split() /
potom  prebehnes vsetky polozky pola a na kazdu aplikujes svoj regex

Napriklad (JavaScript)

var str="user_firstname=Vaclav&user_surname=Havel&_user_city=Praha";

// split the string into array
var arr = str.split("&");

for (k in arr) {
  elem = arr[k];
  // match regex
  match_result=elem.match(/^(\w+)=(\w*)/)
  // get results
  console.log("Full match : " + match_result[0])
  console.log("Group 1    : " + match_result[1])
  console.log("Group 2    : " + match_result[2])
  console.log("------")   
}

mikrom

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #3 kdy: 06. 10. 2018, 12:40:22 »
Vysledky predosleho kodu

Full match : user_firstname=Vaclav
Group 1    : user_firstname
Group 2    : Vaclav
------
Full match : user_surname=Havel
Group 1    : user_surname
Group 2    : Havel
------
Full match : _user_city=Praha
Group 1    : _user_city
Group 2    : Praha
------

Kit

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #4 kdy: 06. 10. 2018, 12:44:21 »
<?php
$str
= "user_firstname=Vaclav&user_surname=Havel&_user_city=Praha";
parse_str($str, $output);
print_r($output);


Výstup:
Array
(
    [user_firstname] => Vaclav
    [user_surname] => Havel
    [_user_city] => Praha
)


gll

  • ****
  • 429
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #5 kdy: 06. 10. 2018, 13:32:26 »
Citace od: regex kdy 06. 10. 2018, 11:55:01
Co neco takoveho http://codepad.org/71ykiwHs?

nebo urllib.parse.parse_qs ze standardní knihovny.

gll

  • ****
  • 429
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #6 kdy: 06. 10. 2018, 13:48:26 »
Citace od: mikrom kdy 06. 10. 2018, 12:37:22
a v akomjazyku to robis ?

Retazec sa da pokrajat cez separator & do pola  / funkcia split() /
potom  prebehnes vsetky polozky pola a na kazdu aplikujes svoj regex

Napriklad (JavaScript)

var str="user_firstname=Vaclav&user_surname=Havel&_user_city=Praha";

// split the string into array
var arr = str.split("&");

for (k in arr) {
  elem = arr[k];
  // match regex
  match_result=elem.match(/^(\w+)=(\w*)/)
  // get results
  console.log("Full match : " + match_result[0])
  console.log("Group 1    : " + match_result[1])
  console.log("Group 2    : " + match_result[2])
  console.log("------")   
}


URLSearchParams funguje ve všech moderních prohlížečích


var params = new URLSearchParams('user_firstname=Vaclav&user_surname=Havel&_user_city=Praha');
for([name, value] of params) {console.log(name, value)}

Palecek.x

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #7 kdy: 06. 10. 2018, 13:59:08 »
Pokud to nejde přímo pomocí regulárního výrazu, který by byl připravený na proměnný počet parametrů, pak by bylo asi nejlepším řešením to, co máte v JS jako UrlSearchParams.

Píšu klienta pro C# a Javu současně. (2 téměř stejné klienty)

Na to znáte nějaké knihovny?

Ovšem neřeší to otázku, jestli by to šlo přes reg ex?

Díky

gll

  • ****
  • 429
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #8 kdy: 06. 10. 2018, 14:25:25 »
Citace od: Palecek.x kdy 06. 10. 2018, 13:59:08
Pokud to nejde přímo pomocí regulárního výrazu, který by byl připravený na proměnný počet parametrů, pak by bylo asi nejlepším řešením to, co máte v JS jako UrlSearchParams.

Píšu klienta pro C# a Javu současně. (2 téměř stejné klienty)

Na to znáte nějaké knihovny?

Ovšem neřeší to otázku, jestli by to šlo přes reg ex?

Díky


(\w+)\=(\w*)\&?


takový regex by mohl fungovat? Ale v každém jazyku pro to existuje knihovna, která ošetří i dekódování. Podívejte se do dokumentace nebo na stack overflow.

Palecek.x

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #9 kdy: 06. 10. 2018, 16:41:47 »
Ano, to je odpověď na otázku, jestli to jde pomocí reg. výrazu- JDE - díky.

Teď je výsledkem:


Match 1
Full match 0-22 `user_firstname=Vaclav&`
Group 1. 0-14 `user_firstname`
Group 2. 15-21 `Vaclav`

Match 2
Full match 22-41 `user_surname=Havel&`
Group 1. 22-34 `user_surname`
Group 2. 35-40 `Havel`

Match 3
Full match 41-57 `_user_city=Praha`
Group 1. 41-51 `_user_city`
Group 2. 52-57 `Praha`

Kit

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #10 kdy: 06. 10. 2018, 16:54:50 »
Co když bude na vstupu tohle?
name=Vaclav%20Havel&_user_city=Praha
Někde to musíš ještě rozkódovat. Proto je lepší použít knihovnu, která je na to dělaná.

gll

  • ****
  • 429
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #11 kdy: 06. 10. 2018, 17:08:31 »
Citace od: Kit kdy 06. 10. 2018, 16:54:50
Co když bude na vstupu tohle?
name=Vaclav%20Havel&_user_city=Praha
Někde to musíš ještě rozkódovat. Proto je lepší použít knihovnu, která je na to dělaná.


asi by byl lepší takový výraz

([^=]+)\=([^=&]*)\&?

Palecek.x

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #12 kdy: 06. 10. 2018, 20:40:53 »
Možná to dělám záhadně, ale mám URL, zavolám URLDecode ze System.Web... a pak vezmu jen query (tzn to, co je za otazníkem, vím co tam firemní systém dává, i když se to může změnit) a až na ni  aplikuju regulární výraz.

Když si nějakej Ind vzpomene, že mi tam strčí bůhvíco, tak na to se samozřejmě asi nikdy 100proc nepřipravím.

Palecek.x

Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #13 kdy: 06. 10. 2018, 20:54:22 »
Citace od: gll kdy 06. 10. 2018, 17:08:31
Citace od: Kit kdy 06. 10. 2018, 16:54:50
Co když bude na vstupu tohle?
name=Vaclav%20Havel&_user_city=Praha
Někde to musíš ještě rozkódovat. Proto je lepší použít knihovnu, která je na to dělaná.


asi by byl lepší takový výraz

([^=]+)\=([^=&]*)\&?

Smím se zeptat, odkud jste čerpal? Díky

gll

  • ****
  • 429
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #14 kdy: 06. 10. 2018, 21:06:58 »
Citace od: Palecek.x kdy 06. 10. 2018, 20:40:53
Možná to dělám záhadně, ale mám URL, zavolám URLDecode ze System.Web... a pak vezmu jen query (tzn to, co je za otazníkem, vím co tam firemní systém dává, i když se to může změnit) a až na ni  aplikuju regulární výraz.

Když si nějakej Ind vzpomene, že mi tam strčí bůhvíco, tak na to se samozřejmě asi nikdy 100proc nepřipravím.

proč nepoužijete HttpUtility.ParseQueryString? https://stackoverflow.com/a/11956978