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 ?

Kód: [Vybrat]
user_firstname=Vaclav&user_surname=Havel&_user_city=Praha

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

Kód: [Vybrat]
^(\w+)=(\w*)

s výsledkem:

Kód: [Vybrat]
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)
Kód: [Vybrat]
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
Kód: [Vybrat]
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 »
Kód: [Vybrat]
<?php
$str 
"user_firstname=Vaclav&user_surname=Havel&_user_city=Praha";
parse_str($str$output);
print_r($output);

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


gll

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

nebo urllib.parse.parse_qs ze standardní knihovny.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #6 kdy: 06. 10. 2018, 13:48:26 »
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)
Kód: [Vybrat]
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

Kód: [Vybrat]
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
    • Zobrazit profil
    • E-mail
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #8 kdy: 06. 10. 2018, 14:25:25 »
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

Kód: [Vybrat]
(\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:

Kód: [Vybrat]
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?
Kód: [Vybrat]
name=Vaclav%20Havel&_user_city=PrahaNěkde to musíš ještě rozkódovat. Proto je lepší použít knihovnu, která je na to dělaná.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #11 kdy: 06. 10. 2018, 17:08:31 »
Co když bude na vstupu tohle?
Kód: [Vybrat]
name=Vaclav%20Havel&_user_city=PrahaNě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

Kód: [Vybrat]
([^=]+)\=([^=&]*)\&?

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 »
Co když bude na vstupu tohle?
Kód: [Vybrat]
name=Vaclav%20Havel&_user_city=PrahaNě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

Kód: [Vybrat]
([^=]+)\=([^=&]*)\&?

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

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Parsování URL query pomocí regulárního výrazu
« Odpověď #14 kdy: 06. 10. 2018, 21:06:58 »
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