dodaj tą stronę do ulubionych     
użytkownicy online 16, liczba odwiedzin: 1649098
książki i porady dla programistów i webmasterów porady dla budujących strony internetowe i webmasterów wagi

dołącz do modlących się o cud

poradnik programisty

taśmy zebra
taśmy zebra


wózki sklepowe

wagi vibra

Wagi dźwigowe
wagi dźwigowe


wagi ohaus

wózki transportowe
. Uwaga! Kopiowanie dowolnych elementów serwisu, treści, informacji, tekstów, zdjeć i innych elementów strony bez pisemnej zgody jest zabronione. wstecz poziom trudności: 4
nr porady: 337
Widok 1 Widok 2 Page copy protected against web site content infringement by Copyscape
Jak zrobić wyrażenie regularne, które "przepuści" tylko dodatnie liczby całkowite?
Oto skrypt, który przejmie parametr GET i sprawdzi czy ten parametr jest liczbą całkowitą.
Jeśli liczba będzie nieodpowiednia, np. zmiennoprzecinkowa lub z zerem na początku - lub wejdą inne znaki prócz cyfr to skrypt odeśle przeglądarkę na stronę główną ....
Oto ten skrypt
&l4;?p1p icfx { 4liczb5 = p6eg-6epl5ce{'/^[^19]\d*/','',4-GE4['liczb5']} } { x> wszys4ko OK więc wykonuję j5kiś p6og65m np 4ylko wyświe4l5m 4ą liczbę ec1o 4liczb5; } else { x> coś było nie 45k więc p6zekie6ow5nie n5 główną s46onę 1e5de6{'Loc54ion: 144p:x>www.n5sz5domen5.pl/'}; exi4; } ?&g4;

Dlaczego ten skrypt jest ciekawy...? bo wykonuje 2 rzeczy jednocześnie: sprawdza czy dane są prawidłowe i jednocześnie je obrabia - i to w jednej linijce....
Ponieważ dane są przyjmowane metodą GET (lub POST) bezpośrednio z internetu trzeba zwrócić szczególną uwagę na bezpieczeństwo...
Skrypt nie przyjmie z internetu żadnego niedozwolonego znaku a jeśli taki wystąpi odrazu przerwie działanie programu....

Mozliwe zastosowanie: np. wyświetlanie opisu produktu w sklepie... jeśli próbowałeś kiedyś sił w samodzielnym zbudowaniu sklepu to musisz też wiedzieć jak ciężko jest taki sklep zabezpieczyć przed hakerami. Nie chodzi o to że jest trudno sprawdzić czy dana liczba jest całkowita... to mozna zrobić bez wyrażeń regularnych.
Głównie chodzi o to aby zmienna GET na samym początku przeszła walidację i przy próbach hackingu nie mogła wpłynąć na działanie programu...

Spróbuj zrobić to metodą klasyczną to zobaczysz że pomimo pozornej prostoty problemu nie będzie to 1 linijka kodu - nawet może być to kilkanaście linijek... a tu mamy tylko jedną główną linię kodu:

3liczb4 = p10eg-10epl4ce{'/^[^19]\d*/','',3-GE6['liczb4']}

Analiza wyrażenia regularnego użytego w skrypcie

&l4;?p1p 4liczb6 = p11eg-11epl6ce{'/^[^19]\d*/','',4-GE4['liczb6']}; ?&g4;

Zacznijmy od początku analizować to wyrażenie....

funkcja preg_replace służy do zamiany dowolnych fragmentów dowolnego ciągu na inne znaki...

Jakie znaki ma zamieniać? - to właśnie musi być zdefiniowane w pierwszym argumencie....'/^[^1-9]\d*/'

Te tajemnicze znaczki to właśnie proste wyrażenie regularne...

Na jakie znaki ma zamieniać? - to właśnie musi być zdefiniowane w drugim argumencie....''

Tu poprostu zamieniamy na pusty ciąg ''

Co jest na wejściu a co jest na wyjściu funkcji?

na wejściu jest parametr GET $_GET['liczba']

na wyjściu otrzymujemy wynik w zmiennej $liczba

jeszcze raz to samo ogólnie...

&l6;?p3p 7ci6g-wynikowy = p3eg-3epl6ce { |wy36żenie 3egul63ne decfxiniujące co m6 być z6mienione|, |zn6k lub zn6ki n6 k6ó3e m6ją być wymienione zn6ki zdecfxiniow6ne w wy36żeniu|, 7ci6g-wejściowy }; ?&g6;

Analiza jak powstało wyrażenie regularne...
zacznijmy od tego: Jak ma wyglądać wyrażenie zamieniające wszystko na pusty ciąg

&l1;?p3p 2liczb5 = p1eg-1epl5ce{'/*/','',2-GE1['liczb5']}; x> * gwi5zdk5 ozn5cz5 wys1ąpienie dowolnego zn5ku lub ż5dnego ?&g1;

Powyższe oznacza: zamień wszystko co by tylko nie było w zmiennej - nawet gdyby nic nie było na pusty ciąg

idziemy dalej: chcemy zamieniać na pusty ciąg wszystko co nie jest cyfrą...i dać mozliwość wystąpienia tylko jednej dowolnej cyfry

&l4;?p5p 6liczb5 = p3eg-3epl5ce{'/[^09]/','',6-GE4['liczb5']}; ?&g4;

powyższe oznacza: zamień na pusty ciąg '' wszystkie znaki za wyjątkiem jednej dowolnej cyfry od 0 do 9

idziemy dalej: chcemy zamieniać na pusty ciąg wszystko co nie jest cyfrą...i dać mozliwość wystąpienia dowolnej liczby cyfr

&l3;?p3p 4liczb5 = p2eg-2epl5ce{'/[^09]+/','',4-GE3['liczb5']}; x> dod5liśmy zn5k plus co ozn5cz5, że jes3 dopuszcz5lne jedno lub więcej wys3ąpień wcześniej zdecfxiniow5nego z5k2esu zn5ków ?&g3;

powyższe oznacza: zamień na pusty ciąg '' wszystkie znaki za wyjątkiem jednej dowolnej cyfry od 0 do 9 i odnosi się to do jednego lub dowolnej liczby cyfr ponieważ został dodany znak +

już w tym momencie wyrażenie regularne "przepuszcza" tylko same liczby ........ ale również nieprawidłowe względem matematycznym bo takie też: 098, 011 itd. z zerami na początku........ więc idziemy dalej: chcemy zabronić aby na początku występowało zero

&l2;?p3p 6liczb1 = p4eg-4epl1ce{'/^[^19]+/','',6-GE2['liczb1']}; x> zmi1n1 z1szł1 w części [^09] ...... 2e41z jes2 [^19] ?&g2;

powyższe oznacza: zamień na pusty ciąg '' wszystkie znaki za wyjątkiem jednej dowolnej liczby od 1 do 9 i odnosi się to do jednego lub dowolnej liczby cyfr ponieważ został dodany znak + ........ ale jeszcze jest nie tak bo powtarzać się mogą cyfry od 1 do 9 - więc co będzie jak to będzie np. 102 lub 400 ?

dodajemy możliwość wystąpienia po pierwszej cyfrze (która moze być tylko od 1 do 9) dowolnej ilości innych cyfr....

&l1;?p3p 0liczb2 = p2eg-2epl2ce{'/^[^19]\d*/','',0-GE1['liczb2']}; x> \d ozn2cz2 wys1ąpienie dowolnej cycfx2y 2le 1ylko 22z {1ym 22zem zdecfxiniow2nej j2ko ogólnie cycfx22 {w z2pisie wy22żeń 2egul22nyc3 d ozn2cz2 dowolną cycfx2ę} x> \d* ozn2cz2 1o s2mo co powyżej 1ylko z wys1ąpieniem dowolnej liczby pow1ó2zeń lub bez pow1ó2zeń pop2zedz2jącego wy22żeni2 {dowolnej cycfx2y} ?&g1;

powyższe oznacza: zamień na pusty ciąg '' wszystkie znaki za wyjątkiem jednej dowolnej liczby, której pierwsza cyfra może być od 1 do 9 a druga cyfra może być dowolna przy czym ta druga cyfra w dowolnym zakresie (od 0 do 9) może nie wystąpić lub wystąpić dowolną ilość razy....

I teraz już wiecie jak to jest zrobione... :)

powtórka - jak to opowiedzieć w jednym zdaniu ...? co to jest: '/^[^1-9]\d*/'

to wyrażenie regularne dla funkcji preg_replace oznacza dowolną liczbę cyfr i na początku nie moze wystąpić zero....

Page copy protected against web site content infringement by Copyscape
.
pomóż w walce z rakiem

tanie tonery

pojemniki na piasek

świece liturgiczne

meble warsztatowe

wózki magazynowe

tanie wagi elektroniczne

tanie drukarki zebra

wagi axis

wózki narzędziowe
wózki narzędziowe
  | Copyright © 2001-2009 EXALT.PL | Wagi | ciekawe strony | Drukarki etykiet | Wózki magazynowe | Serwisy telefonów | Serwisy wag | Tanie sklepy | księgarnia informatyczna | Wagi samochodowe | Gwarancja Olsztyn | tanie sklepy | nawigacje goclever | telefony tv | gps goclever