Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Porovnání stringu s polem stringů s proměnnou

Aktivity
Avatar
Adam Gajdečka:31.8.2019 12:40

Ahoj, prosím o radu.

Mám pole url požadavků při kterých nechci aby se něco stalo. Takže jednoduše zjišťuji, jestli url je v daném zakázaném seznamu, kam píšu adresy url requestů.

Problém je v druhém případě, kdy je v tom obsažena proměnná, kterou jsem napsal zástupným znakem *.

Potřeboval bych, aby se url porovnala i s takovým stringem, ale aby brala v potaz, že je úplně jedno, co je v místě hvězdičky.

Používám Typescript, Lodash a React 16.

Děkuji

Zkusil jsem:

var forbiddenRequests: string[] = [
    "/account/notifications/mark-as-read",
    "/user/*/send-message",
];

if(forbiddenRequests.includes(url) === false)) {
   //neco udelej pokud to neni zakazany request
}
 
Odpovědět
31.8.2019 12:40
Avatar
Jakub Hýža
Člen
Avatar
Jakub Hýža:31.8.2019 13:03

Toto by se dalo udělat přes Regex.
https://www.itnetwork.cz/…vyrazy-regex

Aktuálně nemůžu poskytnou kód ale snad jsem tě alespoň nasměroval

Nahoru Odpovědět
31.8.2019 13:03
Sleep(); Eat();. Code(); Repeat();
Avatar
Odpovídá na Jakub Hýža
Adam Gajdečka:31.8.2019 23:07

Děkuji za komentář. O existenci Regex vím, ale pro mě dost nepřehledný a nemám v něm prakticky žádnou praxi.

 
Nahoru Odpovědět
31.8.2019 23:07
Avatar
ZemiakSK
Člen
Avatar
ZemiakSK:1.9.2019 1:12

Ako už písal Jakub Hýža , regex velmi pomôže

Ak nechceš používať regex , tak som vytvoril funkciu , ktorá to testuje
Použil som string.split() a testpval som potom polia

var forbiddenRequests = [
    "/account/notifications/mark-as-read",
    "/user/*/send-message",
];

function include(testURL){
        splitedURL = testURL.split("/"); // rozdelíme si testovanú URL podlá lomítka "/"
        // tento cyklus prejde cez pole zakázaných URL
        for(i of forbiddenRequests){
                isIncluded = 1; // pri každej zakázanej URL si nastavíme premennú na 1 - budeme ju potrebovať
                TMP = i.split("/"); // každú zakázanú URL rozdelí podľa lomítka "/"

                // Ak sa nerovná dĺžka testovanej a zakázanej URL , tak nemá zmysel testovať , určite sa nerovnajú
                if(TMP.length != splitedURL.length){
                        continue; // preskočime a ideme na ďalšiu zakazanú URL
                };

                //Prejdeme teraz cez obidve premenné
                for(i = 0;i<TMP.length;i++){
                        // ak je v zakazanej premennej hviezdička , nemá zmysel testovať rovnosť , pretože namiesto hviezdičky ide všetko
                        if(TMP[i]=="*"){
                                continue;
                        };
                        // testujeme či sa výrazy nerovnajú
                        // ak sa nerovnajú , nastavíme premennú isIncluded na 0 a vyskočíme z cyklu
                        if(TMP[i]!=splitedURL[i]){
                                isIncluded = 0;
                                break;
                        };

                        // testujeme či je premenná isIncluded nastavená
                        // ak je nastavená na 0 = niečo je počas testu zmenilo , a kedže jediné čo tu premennú mení je nezhoda medzi zakazanou a testovanou URL, pokračujeme ďalej
                        // ak je nastavená na   = nič ju nezmenilo , to znamená , že testovaná a zakazaná URL su rovnaké - vrátime true
                        if(isIncluded == 1){
                                return true;
                        };

                };
        };
        // ak sa dostaneme sem , znamená to , že žiadna zakázaná URL nebola rovnaká ako testovaná - vrátime false
        return false;
};

Samozrejme je to len model
Tvojou úlohou je to zabaliť do triedy aby si to mohlo používať kde chceš
Dôvod prečo som to neurobil ja je v tom , že ty potrebuješ riešenie a podla toho si tu triedu aj upravíš

Dúfam že som pomohol

 
Nahoru Odpovědět
1.9.2019 1:12
Avatar
ZemiakSK
Člen
Avatar
Odpovídá na Adam Gajdečka
ZemiakSK:1.9.2019 10:10

Teraz som si všimol že nepoúživaš čistý JavaScript , ale Typescript
Dúfam že to nevadí

 
Nahoru Odpovědět
1.9.2019 10:10
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Adam Gajdečka
Peter Mlich:2.9.2019 9:41

Regexp v js resi presne to, co chces.
http://www.regexp.cz/

^aaa - string zacina aaa "aaa" "aaab" "aaaxyz123"
bbb$ - string konci bbb "bbb" "xzy123bbb"


Dale pak mas seznamy znaku
[a] = a
[a-z] = a nebo b nebo c nebo...
[A-Z]
[0-9]
[ar4] = [4ra] = 4 nebo r nebo a
a[abc]x = aax nebo abx nebo acx
Opakovani
? = 1
* = 0-nekonecno

  • = 1-nekonecno

{min} {min,max}
{3} 3x
{3\} 3 az nekonecno
{3,5} az 5
Pr:
aaa = a{1,3} = 'a' 1x az 3x
aaa = a{3}
aaa = a+ = 'a' 1x a vickrat
aaa = a* = 'a' vubec nebo vicekrat
aaa = [a]+ seznam znaku, kde je aspon jedno 'a' a opakovani
aaa = [abcd]+ seznam znaku, kde je aspon jedno 'a' a opakovani
aaa = a[abcd]+ retezez zacina 'a', za nim nasleduje cokoliv ze seznamu, kde je aspon jedno 'a', takze to plati i
aaa, aa, ab, ac, ad, aaab, abab ,...

    "/account/notifications/mark-as-read",
    "/user/*/send-message",

new RegExp("[/]account[/]notifications[/]mark-as-read",'') nebo /\/account\/notifications\/mark-as-read/ nebo /[/]account[/]notifications[/]mark-as-read/
new RegExp("^[/]account[/]notifications[/]mark-as-read$",'')

new RegExp("^[/]user[/].*[/]send-message$", ''),
new RegExp("[/]user[/].*?[/]send-message", ''),

cili string zacina [/]user[/], pak jakykoliv znak (.) v jakemkoliv mnozstvi (), a konci to [/]send-message
nebo
ve string kdekoliv od zacatku je [/]user[/], pak jakykoliv znak (.) v jakemkoliv mnozstvi (
) dokud nenarazis (?), na retezec [/]send-message a za nim muze byt take cokoliv, protoze tam neni $ pro ukonceni
.*? = to je takova divoka trojkombinace, kde ? znamena neco jineho nez jsem psal vys, ale je to popsano na te strance
[/] = lomitko se pouziva pro ohraniceni zacatku a konce, proto by melo byt zalomitkovane nebo jako vycet znaku \/ nebo [/]

[/]user[/].*?[/]send-message
plati pro
/user/ahoj/send-message
XYZ/user/ahoj/send-message
XYZ/user/ahoj/send-messageUVW
/user/ahoj/send-messageUVW

^[/]user[/].*?[/]send-message$
^[/]user[/].*[/]send-message$
To by melo byt stejne, protoze pokazde vyzadujes zacatek a konec, takze by tam ? nemel mit vyznam

Zkratka, regularnimi vyrazy hledas ve stringu nejakou cast podle pravidla, ktere si napises. Neni to tak slozite, jak se zda. jen to ma divoky zapis.

Editováno 2.9.2019 9:43
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
2.9.2019 9:41
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.9.2019 9:46

oprava, tady to mrsi texty
{3\} 3 az nekonecno
{3,} 3 az nekonecno - spravne
\+ 1 az nekonecno, samotne plus bez lomitka (nepochopitelne z + udelal odrazku, kdyz odrazka je *)

 
Nahoru Odpovědět
2.9.2019 9:46
Avatar
Odpovídá na Peter Mlich
Adam Gajdečka:30.9.2019 19:34

Super, díky moc. Podařilo se

 
Nahoru Odpovědět
30.9.2019 19:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.