Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

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

Aktivity (2)
Avatar
Adam Gajdečka:31. srpna 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. srpna 12:40
Avatar
Jakub Hýža
Redaktor
Avatar
Jakub Hýža:31. srpna 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. srpna 13:03
Sleep(); Eat();. Code(); Repeat();
Avatar
Odpovídá na Jakub Hýža
Adam Gajdečka:31. srpna 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  +1 31. srpna 23:07
Avatar
ZemiakSK
Člen
Avatar
ZemiakSK:1. září 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. září 1:12
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
ZemiakSK
Člen
Avatar
Odpovídá na Adam Gajdečka
ZemiakSK:1. září 10:10

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

 
Nahoru Odpovědět 1. září 10:10
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Adam Gajdečka
Peter Mlich:2. září 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. září 9:43
 
Nahoru Odpovědět 2. září 9:41
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2. září 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. září 9:46
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 7 zpráv z 7.