Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]sprawdzenie wpisywania numeu ulicy
Forum PHP.pl > Forum > Przedszkole
jacusek
Witam.
Próbuję za pomocą preg_match stworzyć sprawdzenie numeru ulicy i coś mi nie idzie. Chodzi mi o to, żeby user mógł wpisywać to w takich opcjach:
10
10/15
W tym pierwszysm przypadku to oczywiście żaden problem i funkcja może wyglądać tak:
  1. if(!preg_match('/^[0-9]+$/', $z)){
  2. //ciało funkcji}

Z dwoma numerami też nie byłoby problemu:
  1. if(!preg_match('/^[0-9]+ [0-9]+$/', $z)){
  2. //ciało funkcji}

Ale co zrobić, żeby móc dołożyć zamiast spacji znak '/'
znalezłem, że powinno się znaleźć coś takiego
  1. [\Q/\E]
, ale to niestety nie jest skuteczne.
w przzypadku zastosowania tego w ten sposób
  1. !preg_match('/^[0-9]+[\Q/\E]+[0-9]+$/'

dostaję komunikat unknown modifyfier '\'. Szukałem już w różnych tutoralach, ale nigdzie nie znalazłem odpowiedzi na moje pytanie.
CuteOne
Też miałem podobny problem i skończyło się na tym, że walidacja polegała tylko na usunięciu zbędnych znaków (!@#$%^&*) dlaczego?
Przykładowe numery ulic:
12
1/1
1 /2
21/a
2111/1a
123a 12b
smile.gif
blade-mrn
Nie wiem jak w tym wypadku ale generalnie \ służy do informowania parsera PHP żeby zignorował następny znak, a jak chcemy wypisać \ to trzeba dać dwa backslashe \\.
jacusek
niestety dwa backslashe też nie działają.
oi.
Do walidacji formularzy za pomocą JS można użyć gotowca np. www.jsvalidate.com - tylko taka mała uwaga na ich stronie pięknie waliduje formularze ale za cholery nie mogę tego na swoim serwerze zaimplementować.
pablo89pl
preg_match('#^[0-9]+[a-z]*([\s/]+[0-9]*[a-z]*)*#')

10a 15c
10a 23
12/12
16a/23
121/122
12/2/4
takie beda poprawne

bierz pod uwage ze ktos moze takie cos jak 12/2/4 wpisac, mialme ostatnio tkai przypadek w pracy..
jacusek
@pablo89pl
Nie wiem, ale gdzieś jest błąd składniowy. Szukam, ale nie mogę znaleźć.
pablo89pl
dziwne..kopiowalem z regexBuddy, musi działać

Jaki błąd wyświetla? Podaj

btw.
  1. $subject = "12 2a/23c";
  2. $pattern = '%^[0-9]+[a-z]*([\s/]+[0-9]*[a-z]*)*%';
  3. $j = preg_match($pattern, $subject);
  4. echo $j


jacusek
@pablo89pl
wstawiam to do takiej funkcji
  1. function checkstrNo($z,$form_name){
  2. if(!preg_match('%^[0-9]+[a-z]*([\s/]+[0-9]*[a-z]*)*%'), $z)){
  3. $tekst="Użyto niedozwolonych znaków w polu " .$form_name;
  4. popup_alert($tekst);
  5. }
  6. }

i w ogóle program podkreśla mi błąd składniowy unexpected ',' przy zmiennej $z.
pablo89pl
Bo źle nawiasy wstawiłeś..
  1.  
  2. function checkstrNo($z,$form_name)
  3. {
  4. if( !preg_match( '%^[0-9]+[a-z]*([\s/]+[0-9]*[a-z]*)*%', $z ) )
  5. {
  6. $tekst="U?yto niedozwolonych znaków w polu " .$form_name;
  7. popup_alert($tekst);
  8. }
  9. }


PS. To co podałem dozwala male litery i cyfry, jak chcesz duże to musisz dodać
tzn do [a-z] w srodku dodaj A-Z tj. [a-zA-Z] albo bodajże \w na znaki utf, ale to już nie jestem pewien
jacusek
Dzięki.
Ale nie do końca to o co moi chodziło.
Przepuszcza np takie rzeczy jak:
25/c . 25 /@
Tak się zastanawiam i po przeanalizowaniu właściwie jest to sprawa niemal nie do zrobienia - prznajmniej dla kogoś mniej doświadczonego. Przejrzałem sobie różne adresy które posiadam w bazie i niestety możliwości różnych kombinacji są tak szerokie, ze właście trudno wymyślić jakaś regułę.
Na razie wpadłem wymysliłem, ze moznaby ograniczyć tylko do cyfr i liczb ze znakiem łamania(backslash) i oczywiście z odpowiednią długością inputa i nad tym popracuję.
CuteOne
Więc tak jak mówiłem ;] chociaż Tobie dojście do takiego wniosku zajęło całe dwa dni o.O tongue.gif
pablo89pl
Cytat(jacusek @ 26.11.2010, 11:44:28 ) *
Na razie wpadłem wymysliłem, ze moznaby ograniczyć tylko do cyfr i liczb ze znakiem łamania(backslash) i oczywiście z odpowiednią długością inputa i nad tym popracuję.


2 nie przejdzie
czesto są adresy typu 123a/15c
zordon
można łatwo zrobić regułę, która będzie sprawdzała te warianty również ze spacjami, ale ja bym uprościł trochę sprawę i wpisane dane przez użytkownika doprowadził do bardziej eleganckiej postaci, tzn. wywalił wszystkie spacje. Większość użytkowników i tak tego nie zauważy, a nawet jeśli to nie zmienia to znaczenia tej zmiennej.

  1. $string = str_replace(' ', '', $string);
  2.  
  3. var_dump(preg_match('/^[a-zA-Z0-9\/]+$/', $string));


potestuj, powinno działać
jak koniecznie chcesz jeszcze ze spacjami to wystarczy dodać \s(wszystkie białe znaki) do akceptowanych
jacusek
@zordon
dzięki o to właśnie chodziło. Na spacje nie będę pozwalał bo i po co. Błędów się i tak przy tym nie ominę bo przejdzie choćby taki numer a27, ale to już do przeżycia.

dla zainteresowanych można to było rozbudować w ten dość banalny sposób. Trochę na okrętkę, ale nareszcie działa tak jak chciałem:
  1. function checkstrNo($z,$form_name){
  2. if(!is_numeric(substr($z, 0,1))){
  3. $tekst="Numer ulicy musi zaczynać się od cyfry";
  4. popup_alert($tekst);
  5. }else{
  6. if(!preg_match('/^[a-zA-Z0-9\/]+$/', $z)){
  7. $tekst="Użyto niedozwolonych znaków w polu " .$form_name;
  8. popup_alert($tekst);
  9. }
  10. }
  11. }
Fifi209
Na moje oko wystarczy:

#^[\d]{1,4}/[\d]{1,4}$#

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.