Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Palecek.x 06. 10. 2018, 10:57:16

Název: Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 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é?
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: regex 06. 10. 2018, 11:55:01
Co neco takoveho http://codepad.org/71ykiwHs (http://codepad.org/71ykiwHs)?
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: mikrom 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("------")   
}
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: mikrom 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
------
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Kit 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
)
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: gll 06. 10. 2018, 13:32:26
Co neco takoveho http://codepad.org/71ykiwHs (http://codepad.org/71ykiwHs)?

nebo urllib.parse.parse_qs ze standardní knihovny.
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: gll 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)}
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 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
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: gll 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.
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 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`
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Kit 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á.
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: gll 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]
([^=]+)\=([^=&]*)\&?
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 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.
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 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
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: gll 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

Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 06. 10. 2018, 22:38:23
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

protoze se mi to nepodarilo vygooglovat. Diky
Název: Re:Parsování URL query pomocí regulárního výrazu
Přispěvatel: Palecek.x 06. 10. 2018, 22:45:48
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

a tady se to resi pro javu:

https://stackoverflow.com/questions/13592236/parse-a-uri-string-into-name-value-collection/13592324 (https://stackoverflow.com/questions/13592236/parse-a-uri-string-into-name-value-collection/13592324)