Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenie Regularne php
Forum PHP.pl > Forum > PHP
korey
Witam!
Napisałem coś takiego:

  1.  
  2. //Sprawdzam pole "szkola_tel"
  3. if(empty($szkola_tel)){
  4. $info_txt_szkola_tel.='<font color="#B20000"> Pole nie zostało wypełnione.</font>';
  5. $blad=true;
  6. }
  7. else if(!ereg('^[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}$' , $szkola_tel )){
  8. $info_txt_szkola_tel.='<font color="#B20000">Nieprawidłowy numer telefonu.</font>';
  9. $help_txt.='~ <font color="#B20000">Nr.Tel podaj w/g przykładu: <b>000-000-000</b> lub <b>000-00-00</b></font><br />';
  10. $blad=true;
  11. }
  12. else{
  13. $info_txt_szkola_tel.='<font color="#207C07"> OK.</font>';
  14. }

Wyrażenie działa poprawnie jak wpisuje sie numrey tel a takich formatach:
000-00-00
lub
000-000-000

Chciałbym do tego wszystkiego dodać numer kierunkowy, czyli np: +XX\s
lecz gdy próbuje to robię wyrażenie zwraca błąd. sad.gif

Z góry dziękuje za pomoc
TNT
+ chyba musi być escapowany, spróbuj:
Kod
^\+[0-9]{2}\s[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}$


PS
ereg() jest przestarzała - http://pl.php.net/manual/en/function.ereg.php
korey
Hmm to jakiej funkcji używać.?

przerobiłem kod na:
  1. $tel = trim($szkola_tel);
  2. if(empty($szkola_tel)){
  3. $info_txt_szkola_tel.='<font color="#B20000"> Pole nie zostało wypełnione.</font>';
  4. $blad=true;
  5. }
  6. else if(!preg_match('^\+[0-9]{2}\s[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}$' , $tel )){
  7. $info_txt_szkola_tel.='<font color="#B20000">Nieprawidłowy numer telefonu.</font>';
  8. $help_txt.='~ <font color="#B20000">Nr.Tel podaj w/g przykładu: <b>000-000-000</b> lub <b>000-00-00</b></font><br />';
  9. $blad=true;
  10. }
  11. else{
  12. $info_txt_szkola_tel.='<font color="#207C07"> OK.</font>';
  13. }

wstawilem preg_match()
w formularzy wpisywałem:
+23 324-343-434
i
+99 234-12-12
funkcja nadal zwraca błąd
TNT
preg_match ma inne ograniczniki(?) - nie wiem jak to nazwać tongue.gif
Zobacz
Kod
else if(!preg_match('/\+[0-9]{2}\s[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}/'  , $tel )){
korey
użyłem twojego kodu i nic.
usunąłem trim() i nic.
dodałem ^ i $ przed / i nic
dodałem ^ i $ po / i nic sad.gif
nie ma jakiegoś innego sposobu na walidiacje numeru tel.?
TNT
Zobacz co u ciebie wyświetli
  1. <?php
  2. $tel = '+48 000-09-32';
  3. if (preg_match('/\+[0-9]{2}\s[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}/' , $tel))
  4. print 'ogien';
  5. else
  6. print 'failur';
  7. ?>
pyro
Nawet nie patrzyłem na przykłady innych, po prostu ułożyłem nowe:

  1. $phone_no = '+48 503-500-999';
  2. if(preg_match('|(\+[0-9]{2} )?[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}|', $phone_no))
  3. {
  4. echo 'Numer telefonu poprawny';
  5. }
  6. else
  7. {
  8. echo 'Nieprawidłowy numer telefonu';
  9. }
korey
Cytat(pyro @ 28.02.2010, 14:52:38 ) *
Nawet nie patrzyłem na przykłady innych, po prostu ułożyłem nowe:

  1. $phone_no = '+48 503-500-999';
  2. if(preg_match('|(\+[0-9]{2} )?[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}|', $phone_no))
  3. {
  4. echo 'Numer telefonu poprawny';
  5. }
  6. else
  7. {
  8. echo 'Nieprawidłowy numer telefonu';
  9. }

Kod działa poprawnie ale gdy np podaje taki numer:
+3323 234-234-234 zwraca mi OK.
da sie to jakoś ulepszyć.?

teraz tak wygląda kod:
  1. //Sprawdzamy pole "szkola_tel"
  2. if(empty($szkola_tel)){
  3. $info_txt_szkola_tel.='<font color="#B20000"> Pole nie zostało wypełnione.</font>';
  4. $blad=true;
  5. }
  6. else if(!preg_match('|(\+[0-9]{2} )?[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}|' , $szkola_tel )){
  7. $info_txt_szkola_tel.='<font color="#B20000">Nieprawidłowy numer telefonu.</font>';
  8. $help_txt.='~ <font color="#B20000">Nr.Tel podaj w/g przykładu: <b>+00 000-000-000</b> lub <b>+32 000-00-00</b></font><br />';
  9. $blad=true;
  10. }
  11. else{
  12. $info_txt_szkola_tel.='<font color="#207C07"> OK.</font>';
  13. }
thek
Po pierwsze czy ktoś zwrócił uwagę na fakt, że + jest znakiem specjalnym wyrażeń i nie może być wstawiany ot tak sobie, gdyż oznacza, że poprzedzany element musi wystąpić przynajmniej jeden raz? Inna sprawa, że nawet gdy to poprawisz to nie uwzględniasz, że brak kierunkowego znowu wywali błąd. Ta część ma być opcjonalna, więc bez użycia ? się nie obejdzie.
EDIT: Chyba mi się na oczy już rzuciło dziś, albo za długo siedzę przy kompie, ale nie zauważyłem Twojego i późniejszego. Opisywałem wcześniejsze z postem TNT włącznie. Moja wina i kajam się za błąd z warunkowym kierunkowym.

Zastanawiam się, czy aby nie lepszym byłoby ewentualne "chwilowe" usunięcie kierunkowego, czyli +XX i pozbawienie ciągu wszelkich znaków innych niż cyfry bo przecież minus lub spacja mogą wystąpić niekoniecznie w podanych miejscach. Normą jest podawanie numerów nie tylko trójkami, ale także parami, a więc także w postaci: +48 503 50 09 99. Może użyć filter_var i zrobić "satanizację"? winksmiley.jpg W ten sposób nawet głupoty w stylu 7f5s-7f7s76 przeczyści do 75-7776 lub napisać samemu funkcję, która obetnie ewentualny kierunkowy i zostawi same cyfry by myślniki i spacje nie robiły bajzlu. No ale to już kwestia potrzeb i własnego pomysłu na przechowywanie numeru.
pyro
Cytat(thek @ 2.03.2010, 16:02:31 ) *
Po pierwsze czy ktoś zwrócił uwagę na fakt, że + jest znakiem specjalnym wyrażeń i nie może być wstawiany ot tak sobie, gdyż oznacza, że poprzedzany element musi wystąpić przynajmniej jeden raz? Inna sprawa, że nawet gdy to poprawisz to nie uwzględniasz, że brak kierunkowego znowu wywali błąd. Ta część ma być opcjonalna, więc bez użycia ? się nie obejdzie.


Czytałeś w ogóle to wyrażenie regularne? I jedno i drugie zostało uwzględnione.

@korey, zobacz to:

  1.  
  2. preg_match('|^(\+[0-9]{2} )?[0-9]{3}-[0-9]{2,3}-[0-9]{2,3}$|' , $szkola_tel )
Fifi209
Proszę wyrażenie + przykład:

  1. <?php
  2.  
  3. $tel[] = '+32 250-250-45';
  4. $tel[] = '+3423 234-34-56';
  5. $tel[] = '250-78-455';
  6.  
  7. foreach ($tel as $val) {
  8. if (preg_match('#^(\+[\d]{2}+)?\s?([\d]{3}-[\d]{2,3}-[\d]{2,3})$#', $val)) {
  9. echo $val.'<br/>';
  10. }
  11. }
  12.  
  13. ?>
korey
Noo.
Użyłem wyrażenia od fifi209 sprawdziłem numery na różne sposoby i tym razem wszystko jest dobrze.
Dziękuje wam wszystkim.
ale skoro jesteśmy już w temacie wyrażeń to da sie jakoś przerobić to:
Tak by akceptowało adres w postaci "www.strona strony ze uwzględnionymi znakami - _ (i innymi używanymi w adresie). pl,com" itp
  1. $url = trim($szkola_www);
  2. if(empty($szkola_www)){
  3. // POLE NIE OBOWIĄZKOWE
  4. }
  5. else if (!preg_match('/^(http|ftp)([s]{0,1}):\/\/([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)(\.([a-z0-9]{2,6})){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu', $url)){
  6. $info_txt_szkola_www.='<font color="#B20000">Nieprawidłowy adres url.</font>';
  7. $help_txt.='~ <font color="#B20000">Url podaj w/g przykładu: <b>http://</b>www.strona.com<b>/</b></font><br />';
  8. $blad=true;
  9. }
  10. else{
  11. $info_txt_szkola_www.='<font color="#207C07"> OK.</font>';
  12. }

Bo w tym przykładzie działa tylko tak:
http://www.strona.pl/
albo
http://www.strona.com/ itp.
prościej mówiąc chce usunąć http:// i / na koncu
thek
Może to tylko mój pomysł, ale połącz walidację z poprawianiem smile.gif Jeśli brak jest protokołu, to dopisz go i potem już użyj filter_var( $test, FILTER_VALIDATE_URL ). Dopisanie brakującego http:// jest akurat tutaj konieczne, gdyż filtr ten wymaga posiadania protokołu przez ciąg znakowy. Oczywiście wcześniej możesz jeszcze potraktować całość FILTER_SANITIZE_URL
korey
Yyyy.. nie rozumiem. ze niby jak?
thek
FILTER_SANITIZE_URL usuwa wszystkie snaki, które nie mogą pojawić się w URL. Według specyfikacji zostawia jedynie liczby, cyfry oraz znaki $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=. a reszta wylatuje. Teraz jedynie sprawdzamy czy ma "z przodu" protokół jakikolwiek jeśli go brak, doklejamy http:// a potem jeszcze walidacja z użyciem FILTER_VALIDATE_URL. Wiem, że można od razu preg_match walnąć, ale jakoś mam większe zaufanie dla wbudowanych reguł filtrujących niż pisanie wyrażenia "z głowy" i preferuję zdać się podczas walidacji na pewne funkcje. Jedyne co trzeba jeszcze sprawdzić to czy da się przepchnąć adres ip zamiast domeny smile.gif http://80.56.200.43/index.php da się zwalidować czy nie? Bo i takie adresy mogą się przecież trafić...

EDIT: Żeby nie było. Adres podany przeze mnie jest czysto przypadkowy i nie prowadzi nigdzie. To ślepa uliczka mająca jedynie na celu zaprezentowanie wariantu z możliwą sytuacją walidacji IP zamiast domeny smile.gif
korey
Napisałem coś takiego:
  1. //Sprawdzamy pole "szkola_www"
  2. if(empty($szkola_www)){
  3. // POLE NIE OBOWIĄZKOWE
  4. }
  5. else if(!filter_var($szkola_www, FILTER_VALIDATE_URL)){
  6. $info_txt_szkola_www.='<font color="#B20000">Nieprawidłowy adres url.</font>';
  7. $help_txt.='~ <font color="#B20000">Url podaj w/g przykładu: <b>http://</b>www.strona.com<b>/</b></font><br />';
  8. $blad=true;
  9. }
  10. else{
  11. $info_txt_szkola_www.='<font color="#207C07"> OK.</font>';
  12. }
Po wysłaniu formularza mam taki komunikat:
Fatal error: Call to undefined function: filter_var() in C:\Program Files\WebServ\httpd-users\Szkolne_Kola\administrator\add_szkola.php on line 138

Nie mam pojęcia czemu sad.gif
tr0lit
Musisz posiadać na serwerze wersję PHP 5.2.0, lub wyższą. Sprawdź używając funkcji phpinfo().
strife
Cytat(korey @ 6.03.2010, 13:13:32 ) *
Napisałem coś takiego:
  1. //Sprawdzamy pole "szkola_www"
  2. if(empty($szkola_www)){
  3. // POLE NIE OBOWIĄZKOWE
  4. }
  5. else if(!filter_var($szkola_www, FILTER_VALIDATE_URL)){
  6. $info_txt_szkola_www.='<font color="#B20000">Nieprawidłowy adres url.</font>';
  7. $help_txt.='~ <font color="#B20000">Url podaj w/g przykładu: <b>http://</b>www.strona.com<b>/</b></font><br />';
  8. $blad=true;
  9. }
  10. else{
  11. $info_txt_szkola_www.='<font color="#207C07"> OK.</font>';
  12. }
Po wysłaniu formularza mam taki komunikat:
Fatal error: Call to undefined function: filter_var() in C:\Program Files\WebServ\httpd-users\Szkolne_Kola\administrator\add_szkola.php on line 138

Nie mam pojęcia czemu sad.gif


Może masz starą wersję php? http://pl.php.net/filter_var sprawdź jaką masz wersje korzystając z phpinfo();
korey
no macie racje.. ;/ To moze mógłby mo ktoś powiedzieć jak zaktualizować php w programie WebServ 1.3.?
Albo ewentualnie zmienić serwer na którym mógłbym te stronkę testować..?
tr0lit
Ściągnij najnowszą wersję PHP z oficjalnej strony i podmień pliki, albo zmień WebServ na WAMP, albo XAMPP.
korey
Pobrałem nową wersje PHP ale nie bardzo wiem jakie pliki podmieniać. sad.gif
Wiec z podmianami plików dałem sobie spokój i zainstalowałem XAMPP
ale tam nie chce mi sie odpalić MySql sad.gif moze to być winą systemu operacyjnego.? Bo mam win7 64Bit
Cysiaczek
Nie, to na 99,9% Twoja wina i od tego zacznij :-)
Pogogluj trochę, bo problem pewnie już był - nie pisz wszystkiego w tym topiku, bo ma on sprecyzowany tytuł.
korey
już sobie poradziłem wszystko działa biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.